并发(十):用一个类实现遍历线程的所有状态
来源:互联网 发布:二维码扫码软件 编辑:程序博客网 时间:2024/06/01 14:58
在Thread中,有一个关于线程状态的枚举类Thread.State,其共有六个状态,分别为:
1. NEW, 线程未启动;
2. RUNNABLE,线程正在运行中;
3. BLOCKED, 线程因为等待锁被阻塞;
4. WAITING,线程处于等待(信号)状态中;
5. TIMED_WAITING,主动调用了限时等待方法而处于等待状态中;
6. TERMINATED,线程已结束;
下面我们用一个类来遍历线程的所有状态:
public class ThreadStateTest extends Thread { // 同步锁1 private static Object monitorA = new Object(); // 同步锁2 private static Object monitorB = new Object(); // 进入条件 private static volatile boolean locked = false; public void run() { // 一旦启动,将会进入RUNNABLE状态 System.out.println("2:" + this.getState()); synchronized (monitorA) { try { // 3:此时探测,将会处于TIMED_WAITING状态 Thread.sleep(1000); //4:等待锁,处于BLOCKED状态; synchronized (monitorB) { while(!locked) { // 5: 等待信号,处于WAITING状态 monitorB.wait(); } } } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) throws InterruptedException { Thread th = new ThreadStateTest(); // 未启动,NEW状态 System.out.println("1: " + th.getState()); th.start(); // 启动额外的线程,用于观测线程的状态变化 new Thread() { public void run() { synchronized (monitorB) { System.out.println("3:" + th.getState()); while(th.getState() != Thread.State.BLOCKED) { Thread.yield(); } System.out.println("4:" + th.getState()); } while(th.getState() != Thread.State.WAITING) { Thread.yield(); } System.out.println("5:" + th.getState()); // 发信号通知线程激活 synchronized (monitorB) { locked = true; monitorB.notify(); } } }.start(); // 等待线程结束,获取线程的终结状态 th.join(); System.out.println("6:" + th.getState()); }}
最后的输入结果如下,六个状态一个不少:
1: NEW2:RUNNABLE3:TIMED_WAITING4:BLOCKED5:WAITING6:TERMINATED
总结
BLOCKED与WAITING状态的区别:
BLOCKED状态用于等待锁的进入,WAITING状态是因为主动调用了notify、join方法,而待线程信号的通知。
TIMED_WAITING与WAITING的区别:
除了notify、join方法(有限制时间)能让线程进入TIMED_WAITING状态,sleep方法也可以,参见上例中的状态3。
阅读全文
0 0
- 并发(十):用一个类实现遍历线程的所有状态
- Java线程(十):CyclicBarrier-用路障实现分阶段线程并发
- Java线程(十):CyclicBarrier-用路障实现分阶段线程并发
- 用一个状态来实现并发
- 多线程并发请求检测url是否可用,有一个可用停掉所有的线程实现Callable接受线程返回值
- 内核遍历进程中所有的线程
- 用C++遍历一个文件夹下面所有的文件
- 用递归遍历一个目录下的所有文件
- Java遍历一个类的所有属性和值
- java遍历一个包中所有的类,转存,不知好不好用。
- 遍历一个目录下的所有文件
- js遍历一个对象的所有属性
- 遍历一个目录下的所有文件
- 遍历一个目录下的所有文件
- 遍历一个布局里面所有的控件
- 遍历一个文件夹的所有儿子孙子
- iOS 多个线程对数组操作(遍历,插入,删除),实现一个线程安全的NSMutabeArray
- c# 反射 遍历实体的所有字段,ObjectDumper类实现
- easyui-combotree传递参数到后台获取json值来绑定combotree控件
- 什么是服务治理?
- SpringBoot(十) :邮件服务
- 数字图像处理和计算机视觉相关的几个好的视频网站
- @Value用法注意事项
- 并发(十):用一个类实现遍历线程的所有状态
- leetcode之DP总结
- Android之ViewPager跳转时滑动效果交互问题
- 机器学习
- DSP中对中断的理解
- Balala Power!
- 点击平滑到锚点,告别古板式的闪动
- session或scrapy实现模拟登录知乎
- impdp遭遇ORA-39001、ORA-39000,ORA-39142