java線程狀態(tài)-阻塞的理解

很多人對于線程的狀態(tài)不是太了解,本次我想把我理解的有關(guān)線程的相關(guān)知識和大家分享一下刻两,上面的圖片是我從網(wǎng)上找到的扩灯,這張圖片對于線程的知識了解有很大的幫助。
線程的狀態(tài):

  1. 新建狀態(tài)(new):新創(chuàng)建了一個線程對象漏隐,該對象繼承了Therad類或?qū)崿F(xiàn)了Runnable接口,但是此時該對象沒有調(diào)用start()方法奴迅。是一個初始狀態(tài)青责。
  2. 就緒狀態(tài)(Runnable):線程對象創(chuàng)建后,其他線程調(diào)用了該對象的start()方法取具。該狀態(tài)的線程位于可運行的線程池中脖隶,可以運行,等待獲取CPU的時間片暇检。
  3. 運行狀態(tài)(Running):此時線程獲取了CPU产阱,執(zhí)行代碼。
  4. 阻塞狀態(tài)(Blocked):阻塞狀態(tài)是線程因為某種原因放棄CPU的使用權(quán)块仆,暫時停止運行构蹬。知道線程進(jìn)入就緒狀態(tài)(Runnable)王暗,此時才有機會轉(zhuǎn)入到運行狀態(tài)。阻塞狀態(tài)分為以下幾種:
    4.1. 等待阻塞(watiting):運行的線程執(zhí)行wait()方法庄敛,JVM會把該線程放入等待池中俗壹。
    4.2. 超時等待阻塞(time-waiting):運行時的線程會執(zhí)行帶有超時時間的wait()方法,JVM會把該線程放入等待池中藻烤。當(dāng)超時后绷雏,線程重新轉(zhuǎn)入就緒狀態(tài)。
    4.3. 同步阻塞(synchronized):運行時的線程獲取對象的同步鎖時怖亭,若該同步鎖被別的線程占用涎显,則JVM會把該線程放入鎖池中。
    4.4. 其他阻塞:運行的線程執(zhí)行sleep或者join方法依许,或者執(zhí)行I/O請求時棺禾,JVM會把該線程置為阻塞狀態(tài),當(dāng)sleep狀態(tài)超時峭跳,join等待線程終止或者超時是膘婶,線程重新轉(zhuǎn)入就緒狀態(tài)。
  5. 死亡狀態(tài):線程執(zhí)行完畢蛀醉,該線程結(jié)束生命周期悬襟。

以下是阻塞狀態(tài)的實例,通過實例拯刁,并且配合jdk自帶的jvisualvm脊岳,我們可以看到線程的狀態(tài)。

package com.unionfin.thread;

import java.util.concurrent.TimeUnit;

public class JavaThreadState
{
    public static void main(String[] args)
    {

        Thread waittingBlocked = new Thread(new WaitingBlocked(),
                "waittingBlocked");

        Thread timeWaittingBlocked = new Thread(new TimeWaitBlocked(),
                "timeWaittingBlocked");

        // synchronizedBlocked1,synchronizedBlocked2搶同一把鎖垛玻,只有一個可以搶到
        Thread synchronizedBlocked1 = new Thread(new SynchronizedBlocked(),
                "synchronizedBlocked1");

        Thread synchronizedBlocked2 = new Thread(new SynchronizedBlocked(),
                "synchronizedBlocked2");
        // sleepBlocked線程睡了100秒割捅,在這一百秒中,其處于阻塞狀態(tài)
        Thread sleepBlocked = new Thread(new sleepBlocked(), "sleepBlocked");

        // 獲取主線程
        Thread mainTherad = Thread.currentThread();
        // 主線程調(diào)用join方法帚桩,只有joinBlocked線程死亡之后亿驾,主線程才會從阻塞中返回
        Thread joinBlocked = new Thread(new JoinBlocked(mainTherad),
                "joinBlocked");

        waittingBlocked.start();

        timeWaittingBlocked.start();

        synchronizedBlocked1.start();

        synchronizedBlocked2.start();

        sleepBlocked.start();

        joinBlocked.start();

    }
}

/**
 * 等待阻塞,一直處于等待狀態(tài)账嚎,知道有其他線程將其喚醒
 * 
 * @author xiaotao
 * 
 */
class WaitingBlocked implements Runnable
{

    public void run()
    {
        synchronized (WaitingBlocked.class)
        {
            try
            {
                //調(diào)用wait()方法時線程會放棄對象鎖
                WaitingBlocked.class.wait();
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }

    }
}

/**
 * 在五十秒內(nèi)處于等待狀態(tài)莫瞬,過了五十秒之后會被喚醒,進(jìn)入runnable狀態(tài)
 * 
 * @author xiaotao
 * 
 */
class TimeWaitBlocked implements Runnable
{

    public void run()
    {
        try
        {
            synchronized (TimeWaitBlocked.class)
            {
                TimeWaitBlocked.class.wait(50000);
                System.out
                        .println("l have wait about 50 s,so i don't want to wait");
            }

        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }
}

/**
 * 該實例是一個搶鎖的阻塞實例郭蕉,兩個線程爭搶一個鎖疼邀,只有一個線程搶到鎖,另外一個線程搶不到鎖召锈,處于阻塞狀態(tài)
 * 
 * @author xiaotao
 * 
 */
class SynchronizedBlocked implements Runnable
{

    public void run()
    {
        synchronized (SynchronizedBlocked.class)
        {
            while (true)
            {

            }
        }
    }

}

/**
 * 處于sleep阻塞狀態(tài)旁振,睡了100秒之后處于runnable狀態(tài),之后爭搶cpu。
 * 
 * @author xiaotao
 * 
 */
class sleepBlocked implements Runnable
{

    public void run()
    {
        try
        {
            while (true)
            {
                TimeUnit.SECONDS.sleep(100);
                System.out.println("l have sleep 100 s");
            }

        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }
}

class JoinBlocked implements Runnable
{
    private Thread thread;


    public JoinBlocked(Thread thread)
    {
        this.thread = thread;
    }


    public void run()
    {
        try
        {
            thread.join();
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
        while (true)
        {

        }

    }
}

"joinBlocked" prio=6 tid=0x0000000006a2f000 nid=0x2604 runnable [0x00000000077ef000]
   java.lang.Thread.State: RUNNABLE
    at com.unionfin.thread.JoinBlocked.run(JavaThreadState.java:170)
    at java.lang.Thread.run(Thread.java:662)

   Locked ownable synchronizers:
    - None

"sleepBlocked" prio=6 tid=0x0000000006a33000 nid=0x65c waiting on condition [0x00000000076ef000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
    at java.lang.Thread.sleep(Native Method)
    at java.lang.Thread.sleep(Thread.java:302)
    at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:328)
    at com.unionfin.thread.sleepBlocked.run(JavaThreadState.java:137)
    at java.lang.Thread.run(Thread.java:662)

   Locked ownable synchronizers:
    - None

"synchronizedBlocked2" prio=6 tid=0x0000000006a35000 nid=0x2198 runnable [0x00000000075ef000]
   java.lang.Thread.State: RUNNABLE
    at com.unionfin.thread.SynchronizedBlocked.run(JavaThreadState.java:113)
    - locked <0x000000077caf7278> (a java.lang.Class for com.unionfin.thread.SynchronizedBlocked)
    at java.lang.Thread.run(Thread.java:662)

   Locked ownable synchronizers:
    - None

"synchronizedBlocked1" prio=6 tid=0x0000000006a24000 nid=0x251c waiting for monitor entry [0x00000000074ef000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at com.unionfin.thread.SynchronizedBlocked.run(JavaThreadState.java:113)
    - waiting to lock <0x000000077caf7278> (a java.lang.Class for com.unionfin.thread.SynchronizedBlocked)
    at java.lang.Thread.run(Thread.java:662)

   Locked ownable synchronizers:
    - None

"timeWaittingBlocked" prio=6 tid=0x0000000006a23000 nid=0x144c in Object.wait() [0x00000000073ef000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x000000077caf6af8> (a java.lang.Class for com.unionfin.thread.TimeWaitBlocked)
    at com.unionfin.thread.TimeWaitBlocked.run(JavaThreadState.java:87)
    - locked <0x000000077caf6af8> (a java.lang.Class for com.unionfin.thread.TimeWaitBlocked)
    at java.lang.Thread.run(Thread.java:662)

   Locked ownable synchronizers:
    - None

"waittingBlocked" prio=6 tid=0x0000000006a21000 nid=0x1ba4 in Object.wait() [0x00000000072ef000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x000000077caf5960> (a java.lang.Class for com.unionfin.thread.WaitingBlocked)
    at java.lang.Object.wait(Object.java:485)
    at com.unionfin.thread.WaitingBlocked.run(JavaThreadState.java:61)
    - locked <0x000000077caf5960> (a java.lang.Class for com.unionfin.thread.WaitingBlocked)
    at java.lang.Thread.run(Thread.java:662)

   Locked ownable synchronizers:
    - None

以上是dump線程信息规求,我們可以看到各個線程目前所處狀態(tài)筐付。其中有一個線程比較有意思卵惦,就是joinBlocked線程阻肿,在該線程中, 我傳入一個A線程沮尿,A線程調(diào)用join()方法丛塌,此時只有joinBlocked線程死亡之后,A線程才會進(jìn)入runnable階段畜疾。

以上就是線程狀態(tài)的幾個例子赴邻,希望對大家有所幫助。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末啡捶,一起剝皮案震驚了整個濱河市姥敛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瞎暑,老刑警劉巖彤敛,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異了赌,居然都是意外死亡墨榄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門勿她,熙熙樓的掌柜王于貴愁眉苦臉地迎上來袄秩,“玉大人,你說我怎么就攤上這事逢并≈纾” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵砍聊,是天一觀的道長背稼。 經(jīng)常有香客問我,道長辩恼,這世上最難降的妖魔是什么雇庙? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮灶伊,結(jié)果婚禮上疆前,老公的妹妹穿的比我還像新娘。我一直安慰自己聘萨,他們只是感情好竹椒,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著米辐,像睡著了一般胸完。 火紅的嫁衣襯著肌膚如雪书释。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天赊窥,我揣著相機與錄音爆惧,去河邊找鬼。 笑死锨能,一個胖子當(dāng)著我的面吹牛扯再,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播址遇,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼熄阻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了倔约?” 一聲冷哼從身側(cè)響起秃殉,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浸剩,沒想到半個月后钾军,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡乒省,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年巧颈,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袖扛。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡砸泛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蛆封,到底是詐尸還是另有隱情唇礁,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布惨篱,位于F島的核電站盏筐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏砸讳。R本人自食惡果不足惜琢融,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望簿寂。 院中可真熱鬧漾抬,春花似錦、人聲如沸常遂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至平绩,卻和暖如春圈匆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捏雌。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工跃赚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人腹忽。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓来累,卻偏偏與公主長得像砚作,于是被迫代替她去往敵國和親窘奏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

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