目录
线程的生命周期
1、新建状态
通过new关键字创建出一个线程对象,没有启动之前(调用start方法之前)
RunnableDemo runnableDemo = new RunnableDemo(); Thread thread=new Thread(runnableDemo);
public class RunnableDemo implements Runnable {
@Override
public void run() {
for (int i=0;i<10;i++) {
System.out.println(Thread.currentThread().getName() + "--------");
}
}
public static void main(String[] args) {
RunnableDemo runnableDemo = new RunnableDemo();
Thread thread=new Thread(runnableDemo);
thread.start();
for (int i=0;i<10;i++) {
System.out.println(Thread.currentThread().getName() + "--------");
}
}
}
2、就绪状态
调用start方法之后,准备执行,但并没有执行。此时的线程会添加到一个就绪队列中,所有就绪的线程同时去抢占cpu的资源。
thread.start();
3、运行状态
当当前进程获取到cpu资源之后,就绪队列中的所有线程会去抢占cpu的资源,谁先抢占到谁先执行,执行run方法,在执行的过程中就叫做运行状态。
4、死亡状态
当运行中的线程正常执行完所有的代码逻辑或者因为异常情况导致程序结束叫做死亡状态。进入死亡状态的方式:线程正常运行完成且结束;人为中断执行,比如使用stop方法;程序抛出未捕获的异常。
5、阻塞状态
在程序运行过程中,发生某些异常情况,导致当前线程无法再顺利执行下去,此时会进入阻塞状态,进入阻塞状态的原因消除之后,所有的阻塞队列会再次进入到就绪状态中,随机抢占cpu的资源,等待执行。进入阻塞状态的方式:调用sleep方法;调用wait方法;等待io资源; 其他线程调用join方法。
线程池的生命周期
线程池有两种状态:RUNNING和TERMINATED。
三种状态SHUTDOWN、STOP、TIDYING是过渡状态。
1、RUNNING
线程池的初始化状态是RUNNING。即线程池一被创建,就处于RUNNING状态
能接受新提交的任务,能处理阻塞队列中的任务;
2、SHUTDOWN
调用线程池的shutdown()方法时,线程池由RUNNING -> SHUTDOWN。
关闭状态,不再接受新提交的任务,可以继续处理正在执行的任务以及阻塞队列中已保存的任务;
3、STOP
调用线程池的shutdownNow()接口时,线程池由RUNNING -> STOP。
不再接受新提交的任务,直接中断正在执行的任务,不再处理阻塞队列中的任务;
4、TIDYING
当线程池在SHUTDOWN状态下,阻塞队列为空并且线程池中执行的任务也为空时,就会由 SHUTDOWN -> TIDYING。
当线程池在STOP状态下,线程池中执行的任务为空时,就会由STOP -> TIDYING。
所有任务已终止,线程池中线程数量为0。
5、TERMINATED
线程池处在TIDYING状态时,执行完terminated()之后,就会由 TIDYING -> TERMINATED。
线程池彻底关闭。