大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國(guó)咨詢/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁(yè) hot資訊 淺談線程的6種狀態(tài)

淺談線程的6種狀態(tài)

更新時(shí)間:2020-11-06 17:48:38 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1688次

在正式學(xué)習(xí)Java多線程這一重點(diǎn)內(nèi)容之前,我們先來(lái)了解一下線程有哪些狀態(tài),深入理解線程的6種狀態(tài)將會(huì)有助于后面對(duì)Thread類中的方法的理解。


一般情況下,線程分為以下6個(gè)狀態(tài):

1.創(chuàng)建(new)狀態(tài): 準(zhǔn)備好了一個(gè)多線程的對(duì)象

2.就緒(runnable)狀態(tài): 調(diào)用了start()方法, 等待CPU進(jìn)行調(diào)度

3.運(yùn)行(running)狀態(tài): 執(zhí)行run()方法

4.阻塞(blocked)狀態(tài): 線程為等待某個(gè)對(duì)象的“鎖”而暫時(shí)放棄cpu的使用權(quán),且不再參與CPU使用權(quán)競(jìng)爭(zhēng)。直到條件滿足時(shí),重新回到就緒狀態(tài),重新參與競(jìng)爭(zhēng)CPU。

5.等待(waiting):線程無(wú)限等待某個(gè)對(duì)象的“鎖”,或等待另一個(gè)線程結(jié)束的狀態(tài)到來(lái)。

6.終止(dead)狀態(tài): 線程銷毀


當(dāng)需要新起一個(gè)線程來(lái)執(zhí)行某個(gè)子任務(wù)時(shí),就創(chuàng)建了一個(gè)線程。但是線程創(chuàng)建之后,不會(huì)立即進(jìn)入就緒狀態(tài),因?yàn)榫€程的運(yùn)行需要一些條件(比如內(nèi)存資源,程序計(jì)數(shù)器、Java棧、本地方法棧都是線程私有的,所以需要為線程分配一定的內(nèi)存空間),只有線程運(yùn)行需要的所有條件滿足了,才進(jìn)入就緒狀態(tài)。

當(dāng)線程進(jìn)入就緒狀態(tài)后,不代表立刻就能獲取CPU執(zhí)行時(shí)間,也許此時(shí)CPU正在執(zhí)行其他的事情,因此它要等待。當(dāng)?shù)玫紺PU執(zhí)行時(shí)間之后,線程便真正進(jìn)入運(yùn)行狀態(tài)。


線程在運(yùn)行狀態(tài)過(guò)程中,可能有多個(gè)原因?qū)е庐?dāng)前線程不繼續(xù)運(yùn)行下去,比如用戶主動(dòng)讓線程睡眠(睡眠一定的時(shí)間之后再重新執(zhí)行)、用戶主動(dòng)讓線程等待,或者被同步塊給阻塞,此時(shí)就對(duì)應(yīng)著多個(gè)狀態(tài):time waiting(睡眠或等待一定的事件)、waiting(等待被喚醒)、blocked(阻塞)。

當(dāng)由于突然中斷或者子任務(wù)執(zhí)行完畢,線程就會(huì)被消亡。

下面這副圖描述了線程從創(chuàng)建到消亡之間的狀態(tài):

image.png


在有些教程上將blocked、waiting、time waiting統(tǒng)稱為阻塞狀態(tài),這個(gè)也是可以的,只不過(guò)這里我們需要將線程的狀態(tài)和Java中的方法調(diào)用聯(lián)系起來(lái),所以將waiting和time waiting兩個(gè)狀態(tài)分離出來(lái)。

注:sleep和wait的區(qū)別:

sleep是Thread類的方法,wait是Object類中定義的方法.

Thread.sleep不會(huì)導(dǎo)致鎖行為的改變, 如果當(dāng)前線程是擁有鎖的, 那么Thread.sleep不會(huì)讓線程釋放鎖.

Thread.sleep和Object.wait都會(huì)暫停當(dāng)前的線程. OS會(huì)將執(zhí)行時(shí)間分配給其它線程. 區(qū)別是, 調(diào)用wait后, 需要?jiǎng)e的線程執(zhí)行notify/notifyAll才能夠重新獲得CPU執(zhí)行時(shí)間。


下面通過(guò)示例演示sleep()是不會(huì)釋放鎖的。

SleepLockTest.java的源碼

public class SleepLockTest{

private static Object obj = new Object();

public static void main(String[] args){

ThreadA t1 = new ThreadA("t1");

ThreadA t2 = new ThreadA("t2");

t1.start();

t2.start();

}

static class ThreadA extends Thread{

public ThreadA(String name){

super(name);

}

public void run(){

// 獲取obj對(duì)象的同步鎖

synchronized (obj) {

try {

for(int i=0; i <10; i++){

System.out.printf("%s: %d\n", this.getName(), i);

// i能被4整除時(shí),休眠100毫秒

if (i%4 == 0)

Thread.sleep(100);

}

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

}


主線程main中啟動(dòng)了兩個(gè)線程t1和t2。t1和t2在run()會(huì)引用同一個(gè)對(duì)象的同步鎖,即synchronized(obj)。在t1運(yùn)行過(guò)程中,雖然它會(huì)調(diào)用Thread.sleep(100);但是,t2是不會(huì)獲取cpu執(zhí)行權(quán)的。因?yàn)?,t1并沒有釋放“obj所持有的同步鎖”!若我們注釋掉synchronized (obj)后再次執(zhí)行該程序,t1和t2是可以相互切換的。


以上就是關(guān)于線程狀態(tài)的內(nèi)容講解,也是本站的多線程教程中的開篇內(nèi)容,想要系統(tǒng)地學(xué)習(xí)多線程,弄懂線程之間的狀態(tài)轉(zhuǎn)換是必不可少的學(xué)習(xí)內(nèi)容,有利于我們理解多線程中的各種Thread類的方法和多線程編程。


提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)

  • 全國(guó)校區(qū) 2025-06-26 搶座中
免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 久久亚洲一区二区 | 香蕉久久网 | 美女hdxxxx中国 | 国产小呦 | 欧美高清激情毛片 | 爱爱网站免费 | 久久九九久精品国产 | 成人精品视频一区二区在线 | 五月天婷婷激情网 | 80s成年女人毛片免费观看观看 | 精品精品久久宅男的天堂 | 久久精品国产一区二区三区肥胖 | 香蕉久久国产 | 一级特黄aa毛片免费观看 | 狠狠综合久久综合网站 | 久久亚洲影院 | 在线成人a毛片免费播放 | 久久影片 | 亚洲天天操 | 久久在精品线影院精品国产 | 97av视频| 看福利影院 | 狠狠久久久久久亚洲综合网 | 成人亚洲精品一区二区 | 一级a毛片免费观看 | 免费大片黄在线观看yw | 久久99热久久精品 | 欧美三级欧美成人高清www | 日韩精品一区二区三区中文3d | 国产成人a毛片在线 | 日韩欧美黄色 | 国产日韩综合 | 另类图片综合网 | 欧美成人特黄级毛片 | 老司机免费福利影院 | 色爱区综合五月激情 | 亚洲五月激情 | 青青青国产精品手机在线观看 | 欧美一级夜夜爽 视频 | 国产美女a做受大片免费 | 中文字幕在线高清 |