前言:
本文简单介绍一下Java线程的七种状态
Java线程有7种状态,分别是:
1. 新建状态(new)
(1)使用new操作符新创建的一个线程对象,例如new Thread()
;
(2)处于新建状态的线程,内部的任务代码还没开始运行.
2. 可执行/就绪状态(Runnable)
(1)新创建的线程并不自动开始运行,要执行线程,必须调用线程的start()
方法。当调用了线程对象的start()
方法即启动了线程,此时线程就处于就绪状态;
(2)处于就绪状态的线程并不一定立即运行run()
方法,线程还必须==同其他就绪线程竞争CPU==,只有==获得CPU使用权才可以运行线程==;
(3)线程阻塞状态(Blocked)结束后也可以变成就绪状态,或从运行状态(Running)变化到就绪状态.
3. 运行状态(Running)
(1)线程获取到CPU使用权进行执行;
(2)需要注意的是,==线程只能从就绪状态进入到运行状态==,真正开始执行run()方法的内容.
4. 阻塞状态(Blocked)
(1)线程在获取锁失败时(因为锁被其它线程抢占),它会被加入锁的同步阻塞队列,然后线程进入阻塞状态(Blocked);
(2)待其它线程释放锁之后,阻塞状态(Blocked)的线程将在次参与锁的竞争,如果==竞争锁成功==,==线程将进入就绪状态==(Runnable),之后才有机会转到运行状态(Running).
5. 等待状态(Waiting)
(1)线程执行wait()
方法,JVM会把该线程放入等待队列(waitting queue)中,进入等待状态;
(2)处于等待状态的线程将不会被CPU执行,除非线程的运行条件得到满足后,其==可被其他线程唤醒==,进入阻塞状态(Blocked);
(3)调用不带超时的Thread.join()
方法也会进入等待状态.
6. 睡眠(Sleep)
(1)睡眠是等待状态的一种特例,在调用Thread.sleep()
方法,带有超时设定的Object.wait()
方法,带有超时设定的Thread.join()
方法等,线程会进入睡眠状态(Sleep);
(2)睡眠状态进程达到设置时间的等待时间后,睡眠线程将==自动唤醒进入阻塞状态==(Blocked)或就绪状态(Runnable).
7. 死亡(Dead)
(1)线程执行完了或者因异常退出了run()
方法,该线程结束生命周期,死亡的线程==不可再次复生==.
参考文档
1.https://baijiahao.baidu.com/s?id=1626410873162104506&wfr=spider&for=pc