【JavaEE】多线程 -- 线程状态
目录
- 六大状态
- 举例说明
六大状态
- New 新建状态:线程还没出创建,只有Thread 实例化的对象,调用start 方法之前的状态。
- Runnable 运行状态:被系统调度后,CPU 正在执行的,Ready 就绪态,系统调度,随时准备被CPU 执行。
- Blocked 阻塞状态:线程遇到某种机制之后不参与 CPU的调度执行,等待某个条件的触发唤醒线程
- waiting 等待状态: 无限期等待(死等)
- Time_Waiting 超时等待状态:设置了最大等待时间,超出最大等待时间就换醒线程
- Terminated 终止状态:线程生命周期结束后的状态
举例说明
- 接下来我说一个例子来说一下这几个关于线程的状态
阿杰和千均(两个线程)都喜欢上了小美, 两个人心里面都打算怎么追到小美(new 新建状态), 之后他们时刻关注着小美的动态,等着合适的机会接近(线程 READY 就绪状态, 准备如何追到小美)。
小美周末一个人去图书馆,阿杰觉得机会来了,主动上前打招呼并提出一起学习(线程的运行状态, 达成与小美做事, 处于追到小美的运行)。聊天过程中,阿杰想约小美晚上看电影,可小美说要先回宿舍问室友有没有空,一起的话更热闹,阿杰只好等着小美回复(导致当前追求步骤暂停(线程堵塞)的原因是:等待小美询问室友的结果, 小美没说具体时间是多久)。
因为阿杰暂时等不到小美答复,没法继续推进约会的事,所以陷入阻塞等待(等小美回消息)。这时候千均看到小美在图书馆外打电话,赶紧走过去递上一杯热奶茶(此时相当于 CPU 调度切换,千均从就绪状态进入运行状态)。千均和小美聊得不错,想约她下周去看画展,小美说下周要准备考试,得考完试才行,大概一周后有空,此时千均线程陷入了等待状态,具有时效性,线程需要等一周就可以继续执行了),一周后千均就可以再约小美去看画展。
这边千均等待的时候,小美给阿杰回了消息,说室友有空,晚上可以一起去看电影,阿杰收到消息后(忽略初始的心理准备),重新调整状态,准备晚上的约会安排(阿杰获得继续追求的条件,从阻塞状态中唤醒,来到就绪状态准备进一步行动)。到了晚上,阿杰和小美以及她的室友一起看完电影,可小美说 “我和室友一起走就行,你先回去吧,明天再说”,此时阿杰知道要等明天才有机会,于是进入等待状态(有明确的等待节点,知道第二天可以再尝试)。
第二天,阿杰联系小美时,发现小美正在忙社团活动,没回消息,阿杰只能等着她忙完(此时又进入阻塞状态,因为不知道小美具体什么时候忙完,只能被动等待回复)。过了几个小时,小美回复说活动结束了,阿杰赶紧抓住机会约她吃饭,小美同意了。吃饭时阿杰好好表现,之后两人关系逐渐升温,阿杰成功追到了小美,这个追求线程也就结束了(线程结束状态)。
但是千均成了小丑, 还处于等待状态, 等待一个星期之后呢, 但是一个星期之后阿杰牵着小美的手出现在千均面前, 千均看到小美过来等待成功, 这个时候看到阿杰和小美的动作已经知道没机会了, 千均就进入了(线程结束状态)
package thread;
import static java.lang.Thread.sleep;
public class ThreadDemo18 {public static void main(String[] args) throws InterruptedException {Thread t = new Thread(() -> {for(int i = 0; i < 5; i++) {System.out.println("线程执行中...");try {sleep(1000);}catch (InterruptedException e) {e.printStackTrace();}}});//线程启动之前, 状态就是 NEWSystem.out.println(t.getState());t.start();System.out.println(t.getState());sleep(500);System.out.println(t.getState());t.join();//线程运行完毕, 状态就是 TERMINATEDSystem.out.println(t.getState());}
}