java并發(fā)之線程的運行狀態(tài)

線程用了多年勉耀,一直是處于只會用的狀態(tài)指煎,最近想詳細的研究一下多線程,在這里做一下記錄便斥。在Thread中一共有6種狀態(tài)至壤。

  • NEW : 創(chuàng)建了Thread對象,但尚未啟動的線程的線程狀態(tài).
  • RUNNABLE : 調(diào)用start()方法后的可運行狀態(tài)枢纠,這個狀態(tài)可以切換到除了NEW之外的任何其它狀態(tài)像街。
  • BLOCKED :線程阻塞狀態(tài)。等待監(jiān)視器的鎖晋渺,拿到鎖后切換回RUNNABLE繼續(xù)執(zhí)行镰绎。
  • WAITING : 線程等待狀態(tài)(no timeout). RUNNABLE狀態(tài)中的線程在掉用Object#wait()、join()或者LockSupport#park()后會進入這個狀態(tài)木西。
  • TIMED_WAITING : 線程等待狀態(tài)(timeout). RUNNABLE狀態(tài)中的線程在掉用#sleep畴栖、Object#wait(long)、join(long)八千、LockSupport#parkNanos吗讶、LockSupport#parkUntil后會進入到這個狀態(tài)。
  • TERMINATED : 線程運行完畢的線程終止狀態(tài)恋捆。RUNNABLE 執(zhí)行結(jié)束照皆。
    關(guān)系圖如下圖所示
線程狀態(tài)

示例代碼如下:

/**
 * 示例2 - 多線程運行狀態(tài)切換示例 <br/>
 */
public class Demo2 {
    public static Thread thread1;
    public static Demo2 obj;

    public static void main(String[] args) throws Exception {
        // 第一種狀態(tài)切換 - 新建 -> 運行 -> 終止
        System.out.println("#######第一種狀態(tài)切換  - 新建 -> 運行 -> 終止################################");
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("thread1當前狀態(tài):" + Thread.currentThread().getState().toString());
                System.out.println("thread1 執(zhí)行了");
            }
        });
        System.out.println("沒調(diào)用start方法,thread1當前狀態(tài):" + thread1.getState().toString());
        thread1.start();
        Thread.sleep(2000L); // 等待thread1執(zhí)行結(jié)束沸停,再看狀態(tài)
        System.out.println("等待兩秒膜毁,再看thread1當前狀態(tài):" + thread1.getState().toString());
        // thread1.start(); TODO 注意,線程終止之后愤钾,再進行調(diào)用爽茴,會拋出IllegalThreadStateException異常

        System.out.println();
        System.out.println("############第二種:新建 -> 運行 -> 等待 -> 運行 -> 終止(sleep方式)###########################");
        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {// 將線程2移動到等待狀態(tài),1500后自動喚醒
                    Thread.sleep(1500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("thread2當前狀態(tài):" + Thread.currentThread().getState().toString());
                System.out.println("thread2 執(zhí)行了");
            }
        });
        System.out.println("沒調(diào)用start方法绰垂,thread2當前狀態(tài):" + thread2.getState().toString());
        thread2.start();
        System.out.println("調(diào)用start方法室奏,thread2當前狀態(tài):" + thread2.getState().toString());
        Thread.sleep(200L); // 等待200毫秒,再看狀態(tài)
        System.out.println("等待200毫秒劲装,再看thread2當前狀態(tài):" + thread2.getState().toString());
        Thread.sleep(3000L); // 再等待3秒胧沫,讓thread2執(zhí)行完畢昌简,再看狀態(tài)
        System.out.println("等待3秒,再看thread2當前狀態(tài):" + thread2.getState().toString());

        System.out.println();
        System.out.println("############第三種:新建 -> 運行 -> 阻塞 -> 運行 -> 終止###########################");
        Thread thread3 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (Demo2.class) {
                    System.out.println("thread3當前狀態(tài):" + Thread.currentThread().getState().toString());
                    System.out.println("thread3 執(zhí)行了");
                }
            }
        });
        synchronized (Demo2.class) {
            System.out.println("沒調(diào)用start方法绒怨,thread3當前狀態(tài):" + thread3.getState().toString());
            thread3.start();
            System.out.println("調(diào)用start方法纯赎,thread3當前狀態(tài):" + thread3.getState().toString());
            Thread.sleep(200L); // 等待200毫秒,再看狀態(tài)
            System.out.println("等待200毫秒南蹂,再看thread3當前狀態(tài):" + thread3.getState().toString());
        }
        Thread.sleep(3000L); // 再等待3秒犬金,讓thread3執(zhí)行完畢,再看狀態(tài)
        System.out.println("等待3秒六剥,讓thread3搶到鎖晚顷,再看thread3當前狀態(tài):" + thread3.getState().toString());

    }
}

運行結(jié)果:


#######第一種狀態(tài)切換  - 新建 -> 運行 -> 終止################################
沒調(diào)用start方法,thread1當前狀態(tài):NEW
thread1當前狀態(tài):RUNNABLE
thread1 執(zhí)行了
等待兩秒疗疟,再看thread1當前狀態(tài):TERMINATED

############第二種:新建 -> 運行 -> 等待 -> 運行 -> 終止(sleep方式)###########################
沒調(diào)用start方法该默,thread2當前狀態(tài):NEW
調(diào)用start方法,thread2當前狀態(tài):RUNNABLE
等待200毫秒策彤,再看thread2當前狀態(tài):TIMED_WAITING
thread2當前狀態(tài):RUNNABLE
thread2 執(zhí)行了
等待3秒栓袖,再看thread2當前狀態(tài):TERMINATED

############第三種:新建 -> 運行 -> 阻塞 -> 運行 -> 終止###########################
沒調(diào)用start方法,thread3當前狀態(tài):NEW
調(diào)用start方法店诗,thread3當前狀態(tài):RUNNABLE
等待200毫秒裹刮,再看thread3當前狀態(tài):BLOCKED
thread3當前狀態(tài):RUNNABLE
thread3 執(zhí)行了
等待3秒,讓thread3搶到鎖庞瘸,再看thread3當前狀態(tài):TERMINATED

Process finished with exit code 0
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末必指,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子恕洲,更是在濱河造成了極大的恐慌塔橡,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件霜第,死亡現(xiàn)場離奇詭異葛家,居然都是意外死亡,警方通過查閱死者的電腦和手機泌类,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門癞谒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人刃榨,你說我怎么就攤上這事弹砚。” “怎么了枢希?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵桌吃,是天一觀的道長。 經(jīng)常有香客問我苞轿,道長茅诱,這世上最難降的妖魔是什么逗物? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮瑟俭,結(jié)果婚禮上翎卓,老公的妹妹穿的比我還像新娘。我一直安慰自己摆寄,他們只是感情好失暴,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著微饥,像睡著了一般逗扒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上畜号,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音允瞧,去河邊找鬼简软。 笑死,一個胖子當著我的面吹牛述暂,可吹牛的內(nèi)容都是我干的痹升。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼畦韭,長吁一口氣:“原來是場噩夢啊……” “哼疼蛾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起艺配,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤察郁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后转唉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體皮钠,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年赠法,在試婚紗的時候發(fā)現(xiàn)自己被綠了麦轰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡砖织,死狀恐怖款侵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情侧纯,我是刑警寧澤新锈,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站眶熬,受9級特大地震影響壕鹉,放射性物質(zhì)發(fā)生泄漏剃幌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一晾浴、第九天 我趴在偏房一處隱蔽的房頂上張望负乡。 院中可真熱鬧,春花似錦脊凰、人聲如沸抖棘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽切省。三九已至,卻和暖如春帕胆,著一層夾襖步出監(jiān)牢的瞬間朝捆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工懒豹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芙盘,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓脸秽,卻偏偏與公主長得像儒老,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子记餐,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容