并发(十):用一个类实现遍历线程的所有状态

来源:互联网 发布:二维码扫码软件 编辑:程序博客网 时间: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

总结

  1. BLOCKED与WAITING状态的区别:

    BLOCKED状态用于等待锁的进入,WAITING状态是因为主动调用了notify、join方法,而待线程信号的通知。

  2. TIMED_WAITING与WAITING的区别:

    除了notify、join方法(有限制时间)能让线程进入TIMED_WAITING状态,sleep方法也可以,参见上例中的状态3。

阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 杯孕当月做了C丁怎么办 玩全军出击手机发烫就出现卡怎么办 不小心买了彩虹六号肝帝版本怎么办 微信游戏刺激战场电脑卡怎么办 电脑更新了以前的东西都没了怎么办 安装黑苹果鼠标键盘不能用怎么办 苹果开机卡在白底黑苹果怎么办 信长之野望14没有剧情触发怎么办 玩cf手游手机屏幕摩擦力大怎么办 网吧有战地1没有橘子平台怎么办 俩人打仗了对方想讹我怎么办 环世界模组装多了打不开怎么办 手机百度云视频播放画面太小怎么办 ps文件说数据似乎已经损坏怎么办 百度云中的压缩包下载的很慢怎么办 游戏压缩出现未知错误或损坏怎么办 百度云里的压缩包解压后损坏怎么办 联创打印时显示压缩文件失败怎么办 电脑的软件打开出现未知格式怎么办 图片只突出人物边上全黑怎么办 合金机兵存档密码忘了怎么办 手机网页验证码无法加载插件怎么办 绝地求生次激战场机型不支持怎么办 木茷生存中文版安装包损坏了怎么办 手机下载软件显示安装包损坏怎么办 不小心把qq图片删了怎么办 奶水不足宝宝不好好吸奶怎么办 膀胱切除前列腺切除阴茎不硬怎么办 小孩的睾丸睾丸碰肿了怎么办 怎么判断小孩子的睾丸没下来怎么办 怀孕39周腰酸屁股酸疼该怎么办 我儿子18岁睾丸筋鼓起来怎么办 去医院检查说精子跑的慢怎么办 多囊卵巢综合症引起屁股增大怎么办 蚊子咬了肿了挠破了流水怎么办 血糖高引发的睾丸一直烂怎么办? 被洪水淹过的猪后期怎么办 做睾丸阴囊彩超阴茎突然勃起怎么办 阴茎冠状沟皮肤感染总不愈合怎么办 不小心咬到孩子破皮了怎么办 小孩子不小心碰到脸黑了一块怎么办