线程的执行状态以及通信方式

线程的五种状态:

先上图:
在这里插入图片描述
1.新建(new):
新建了一个线程对象.
2.可运行(runnable):
线程对象创建后,其他线程(比如mian线程)调用了该对象的start方法,该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu的使用权
3运行(running):
可运行状态的线程获得了cpu时间片,执行程序代码
4.阻塞(blocked):
阻塞状态是指线程因为某种原因放弃了cpu的使用权,也让出了cpu时间片,暂时停止运行,直到线程进入可运行状态,才有机会再次获得CPU 时间片转到运行状态
5.死亡(dead):
线程run main方法执行结束,或者run方法出现异常,该线程的生命周期结束,死亡线程不可复生

三种阻塞:

1.等待阻塞:
运行的线程使用的wait方法,JVM将该线程放进等待队列中
2.同步阻塞:
运行线程获取对象同步锁的时候,若该线程锁被别的线程所占用,JVM会把该线程放入锁池中
3.其他阻塞;
执行了sleep join等方法,或者发出了IO请求,当sleep超时,join等待线程终止或者超时,io处理完毕时,线程会重新转入可运行状态

线程的通信有两种方式:

1.synchronized + wait + notify:
三个方法都是object的方法,所以所有类都可以继承这三个方法
wait方法:
使得当前线程必须要等待,等到另一个线程调用notify或者notifyall方法.
notify:
会唤醒一个等待当前对象的锁的线程,而notify就是唤醒所有等待锁的线程.
wait notify方法要求在调用时线程已经获得对象的锁,所以这两个方法要放在synchronized方法或者synchronized块中
sleep与wait方法的区别:sleep方法是不释放锁的,wait方法释放锁
2.lock + condition + await + signal:
都可以达到通信的效果,但是对比第一种方式:
1.locl是个类
2.执行完必须在finally里释放锁,执行前必须上锁,而且要紧跟try代码块
3.可以自己控制锁哪个线程,保证公平性
4.性能上高一些,因为大量同步

学习年限不足,知识过浅,说的不对请见谅。

世界上有10种人,一种是懂二进制的,一种是不懂二进制的。

发布了71 篇原创文章 · 获赞 54 · 访问量 42万+

猜你喜欢

转载自blog.csdn.net/weixin_43326401/article/details/104107084