浅谈线程状态

  • 线程状态

线程状态转换

java的线程一共有五种状态,分别为new(新建), runnable(就绪),running(执行),blocked(阻塞),dead(死亡)

new
新建状态:当我们new Thread()完一个线程之后,它就处于新建状态了。

runnable
就绪状态:当我们start()一个线程的时候,他就处于一个就绪状态,然后等待cpu的时间片。

running
运行状态:当就绪状态的线程分配到了cpu时间片(执行线程的代码)的时候,他就处于运行状态。

blocked
BLOCKED : 阻塞状态,当线程竞争锁失败的时候会处于这种状态

       //t1,t2锁同一个对象,t1启动后t2才启动,保证t1的run代码在t2之前先执行,t1执行后休眠1000s,线程休眠不释放锁,保证t2一定处于阻塞状态,我们用jvisualvm查看线程状态
       Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (a){
                    System.out.println("--->"+ Thread.currentThread().getName());
                    try {
                        Thread.sleep(100000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (a){
                    System.out.println("--->"+ Thread.currentThread().getName());
                }
            }
        });
        t1.start();
        Thread.sleep(1000);
        t2.start();
        Thread.sleep(100000);

"Thread-0" #13 prio=5 os_prio=0 tid=0x000000001d7e2000 nid=0x4300 waiting on condition [0x000000001e58f000]
java.lang.Thread.State: TIMED_WAITING (sleeping)

"Thread-1" #14 prio=5 os_prio=0 tid=0x000000001d7ce800 nid=0x11b4 waiting for monitor entry [0x000000001e68f000]
java.lang.Thread.State: BLOCKED (on object monitor)

t1对应Thread-0;t2对应Thread-1,t1处于timed_watting状态,t2处于blocked状态,是因为他因为竞争不到锁.

TIMED_WAITING: 等待一段时间;当调用wait(time),Thread.sleep(time),线程会处于这种状态
上面的例子中t1之所以TIMED_WAITTING,是因为t1执行了Thread.sleep(int time)的方法,实际上wait(int time)也会使线程处于这种状态.

WAITING : 等待状态,当调用wait()方法的时候会处于这种状态

dead
死亡状态,当线程执行完毕处于这种状态

  • wait()/notify()/notifyAll()

wait()/notify()/notifyAll()这三个都是object的内置方法,他只能在监视器(synchronized)内使用,作用的是该监视器相关的线程.当他们运行在监视器外面的时候会报错.


监视器

该图是Java的监视器结构图(synchronized实际就是通过监视器来实现同步的),它由三部分组成,owner是存储的是正在执行的线程(最多只有一个),waitSet是被wait()而正在等待的线程,entryList是竞争锁失败而等待的线程

wait()
当线程被wait()以后会进入waitSet等待队列中

notify()
唤醒waitSet中的一个线程

notifyAll()
唤醒waitSet的所有线程去竞争锁

  • sleep/yield/join

sleep/yield/join 都是Thread的静态方法,他们作用的是本线程
sleep
让线程休眠,但是休眠期间不释放锁.

yield
暂停带线程,将Running状态转变为Runnable状态

join
把本来的异步的线程加入到父线程中,父线程只有等该子线程执行完毕才能继续执行.

       System.out.println(Thread.currentThread().getName() + ",start...");
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println(Thread.currentThread().getName() + ",start...");
                    Thread.sleep(1000);
                    System.out.println(Thread.currentThread().getName() + ",end...");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        t.start();
        t.join();
        System.out.println(Thread.currentThread().getName() + ",end...");

上面的例子中,假如没有t.join(),"main,end..."肯定在"Thread-0,end..."之前,因为Thread-0线程要休眠一分钟;但是如果加了t.join()之后,,"main,end..."在"Thread-0,end..."之后才输出,这是因为join的作用就是让子线程全部执行完才能执行父线程

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容

  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 2,438评论 1 15
  • 有一个小女孩 在她生下来不久父母离婚 跟着她爸 从没见过她妈 在十八岁快生日那年终于知道她妈的电话 忍不住打了个电...
    weture阅读 402评论 0 0
  • 察觉日记--看完同学们的讨论,发现我的模式还是关注自己,小7和张妍的对话中我回复的都是自己发现了什么什么,却没有真...
    45d16e1f38a8阅读 127评论 0 0