概念
线程和进程
简单理解:应用软件中互相独立,可以同时运行的功能。多线程可以让程序同时做多件事情,提高效率。
应用场景:软件中的耗时操作(拷贝、迁移大文件,加载大量的资源),所有的聊天软件,所有的后台服务器
并发和并行
多线程的实现方式
继承Tread类的方式进行
Thread类表示线程
1、自己定义一个类继承Thread
2、重写run方法
3、创建子类的对象,并启动线程(用start方法)
public class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(getName() + "HelloWorld");
}
}
}
public class ThreadDemo {
public static void main(String[] args) {
MyThread t1 = new MyThread();
MyThread t2 = new MyThread();
t1.setName("线程1");
t2.setName("线程2");
t1.start();
t2.start();
}
}
实现Runnable接口的方式进行实现
1、自己定义一个类实现Runnable接口
2、重写里面的run方法
3、创建自己的类的对象
4、创建一个Thread类的对象,并开启线程
public class MyRun implements Runnable{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
//获取当前线程的对象(哪条线程执行到这个方法,此时获取的就是哪条线程的对象)
Thread t = Thread.currentThread();
System.out.println(t.getName()+"HelloWorld");
}
}
}
public class ThreadDemo {
public static void main(String[] args) {
MyRun mr = new MyRun();//创建MyRun对象表示多线程要执行的任务
Thread t1 = new Thread(mr);//创建线程对象
Thread t2 = new Thread(mr);
t1.setName("线程1");
t2.setName("线程2");
t1.start();//开启线程
t2.start();
}
}
利用Callable接口和Future接口方式实现
特点:可以获取到多线程运行的结果
1、创建一个类MyCallable实现Callable接口
2、在类中重写call(是有返回值的,表示多线程运行的结果)
3、创建MyCallable对象(表示多线程要执行的任务)
4、创建FutureTask的对象(作用管理多线程运行的结果)
5、创建Thread类的对象,并启动(表示线程)
public class MyCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
//求1~100之和
int sum = 0;
for (int i = 0; i < 100; i++) {
sum+=i;
}
return sum;
}
}
public class ThreadDemo {
public static void main(String[] args) throws ExecutionException, InterruptedException {
//创建MyCallable对象(表示多线程要执行的任务)
MyCallable mc = new MyCallable();
//创建FutureTask的对象(作用管理多线程运行的结果)
FutureTask<Integer> ft = new FutureTask<>(mc);
//创建线程对象
Thread t1 = new Thread(ft);
//启动线程
t1.start();
//获取多线程运行的结果
Integer result = ft.get();
System.out.println(result);
}
}
总结
常见的成员方法(Thread类)
线程优先级
Thread类中的成员方法:
优先级高的优先运行的概率大(是概率不是一定)
守护线程
final void setDaemon(boolean on) 设置为守护线程(参数为true)
细节:当其它的非守护线程执行完毕之后,守护线程会陆续结束(注意不一定是立即结束)
礼让线程
public static void yield() 出让线程/礼让线程
Java中采用抢占式调度(随机),此方法可以让不同线程尽量均匀调度(不是一定,是尽量)
插入线程
public static void join() 插入线程
作用:把方法调用者的这个线程插入到当前线程(参数)之前
线程的生命周期
线程的状态
没有运行状态:线程运行时交给CPU,不归Java管