线程的几种状态你真的了解么

线程状态介绍

这里我们讲的是Java中的线程状态。

线程状态如下:

  • 线程初始状态:NEW

  • 线程运行状态:RUNNABLE

  • 线程阻塞状态:BLOCKED

  • 线程等待状态:WAITING

  • 超时等待状态:TIMED_WAITING

  • 线程终止状态:TERMINATED

其中等待状态应该是一个比较复杂且重要的状态。

线程进入等待状态,即线程因为某种原因放弃了CPU使用权,阻塞也分为几种情况:

  • 等待阻塞:运行的线程执行wait方法,JVM会把当前线程放入到等待队列

  • 同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被其他线程锁占用了,那么JVM会把当前的线程放入到锁池中

  • 其他阻塞:运行的线程执行Thread.sleep或者join方法,或者发出了I/O请求时,JVM会把当前线程设置为阻塞状态,当sleep结束join线程终止、I/O处理完毕则线程恢复

线程状态间的转换如下图:

线程的几种状态你真的了解么_第1张图片

下面我将讲解哪些情况会进入这些状态。

线程sleep时的状态

线程的几种状态你真的了解么_第2张图片

运行结果

new t1 t1 的状态:NEW
t1 running is false,t1将sleep
t1.sleep()时的状态:TIMED_WAITING

我们来分析一下,当new Thread时,线程t1[Thread-0]状态为NEW。线程启动,执行run()方法,打印t1 running is false,t1将sleep,此时线程t1睡眠。然后主线程睡眠,变量running设置为false。这线程t1还在睡眠中。再将主线程睡眠,线程t1仍然在睡眠中。此时线程t1的状态为TIMED_WAITING

如果我们将线程t1中的睡眠时间修改一下

Thread.sleep(10000L);  -> Thread.sleep(3000L);

再来看看运行结果

new t1 t1 的状态:NEW
t1 running is false,t1将sleep
t1.sleep()时的状态:TERMINATED

线程t1终止,所以说看代码时不要认为一看到sleep()就是超时等待【TIMED_WAITING】状态。要看看线程是否已经终止了。

线程join时的状态

线程的几种状态你真的了解么_第3张图片

运行结果如下

t2中执行t1.join(5000L)
t2的状态:TIMED_WAITING
t2中执行t1.join()
t2的状态:WAITING
t2执行完

当执行

t1.start();
t2.start();

线程t1执行睡眠,此时进入线程t2,并执行t2中执行t1.join(5000L)。接下来t1会抢占,进入主线程,主线程睡眠,此时t2还在等待t1,所以t2的线程状态为【TIMED_WAITING】。这时主线程又睡眠,t2里面开始执行t1.join(),此时t2的状态为【WAITING】。

线程synchronized时的状态

线程的几种状态你真的了解么_第4张图片

我们来看运行结果

t1抢不到锁的状态:BLOCKED
t1抢到锁

主线程启动,先抢到锁。此时t1.start()启动了t1线程,这时候主线程睡眠,锁还没有释放。此时的t1状态为【BLOCKED】。

线程wait时的状态

线程的几种状态你真的了解么_第5张图片

运行结果

t1将wait(1000L)
t1的状态:TIMED_WAITING
t1的状态:BLOCKED
t1将wait
t1的状态:WAITING
t1将执行完
t1的状态:RUNNABLE
t1的状态:TERMINATED

主线程启动,执行t1.start(),进入t1,执行t1将wait(1000L),此时t1让出锁。在t1超时等待的同时,主线程睡眠。当后,这里主线程抢到锁,t1的状态为【TIMED_WAITING】。这时主线程执行object.notify(),但这时锁还没有释放,t1还没有获取到锁,所以t1状态【BLOCKED】。之后主线程释放锁,t1获得锁,执行object.wait(),这时t1的状态【WAITING】。然后回到主线程,并获得锁,执行object.notify()。此时t1线程被唤醒并处于运行状态【RUNNABLE】。t1执行完成,状态为【TERMINATED】。

线程park()时的状态

线程的几种状态你真的了解么_第6张图片

t1 park后的状态:WAITING
t1 unpark后的状态:WAITING

大家可以思考下线程t1为什么是这个状态,有机会我会写一篇LockSupport的文章。

往期推荐

  • 我写出这样干净的代码,老板直夸我

  • 云南丽江旅游攻略

  • 使用ThreadLocal怕内存泄漏?

  • Java进阶之路思维导图

  • 程序员必看书籍推荐

  • 3万字的Java后端面试总结(附PDF)

扫码二维码,获取更多精彩。或微信搜Lvshen_9,可后台回复获取资料

1.回复"java" 获取java电子书;

2.回复"python"获取python电子书;

3.回复"算法"获取算法电子书;

4.回复"大数据"获取大数据电子书;

5.回复"spring"获取SpringBoot的学习视频。

6.回复"面试"获取一线大厂面试资料

7.回复"进阶之路"获取Java进阶之路的思维导图

8.回复"手册"获取阿里巴巴Java开发手册(嵩山终极版)

9.回复"总结"获取Java后端面试经验总结PDF版

10.回复"Redis"获取Redis命令手册,和Redis专项面试习题(PDF)

11.回复"并发导图"获取Java并发编程思维导图(xmind终极版)

另:点击【我的福利】有更多惊喜哦。

你可能感兴趣的:(Java,线程池,多线程,多线程,java,thread,并发编程,面试)