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

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

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

更新時間:2020-11-06 17:48:38 來源:動力節(jié)點 瀏覽1723次

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


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

1.創(chuàng)建(new)狀態(tài): 準備好了一個多線程的對象

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

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

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

5.等待(waiting):線程無限等待某個對象的“鎖”,或等待另一個線程結束的狀態(tài)到來。

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


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

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


線程在運行狀態(tài)過程中,可能有多個原因導致當前線程不繼續(xù)運行下去,比如用戶主動讓線程睡眠(睡眠一定的時間之后再重新執(zhí)行)、用戶主動讓線程等待,或者被同步塊給阻塞,此時就對應著多個狀態(tài):time waiting(睡眠或等待一定的事件)、waiting(等待被喚醒)、blocked(阻塞)。

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

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

image.png


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

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

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

Thread.sleep不會導致鎖行為的改變, 如果當前線程是擁有鎖的, 那么Thread.sleep不會讓線程釋放鎖.

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


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

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對象的同步鎖

synchronized (obj) {

try {

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

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

// i能被4整除時,休眠100毫秒

if (i%4 == 0)

Thread.sleep(100);

}

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

}


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


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


提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 久久久噜噜噜久噜久久 | 久久高清 | 咪咪色网 | 性视频一区 | 国产成人综合亚洲欧洲色就色 | 精品在线观看一区 | 欧美日韩国产亚洲一区二区三区 | 性生生活三级视频观看 | 精品久久久久久久久久久 | 青草免费 | 欧美香蕉视频 | 亚洲国产欧美91 | 欧美一级永久免费毛片在线 | 久久香蕉国产线 | 91精品啪在线观看国产老湿机 | 亚洲十欧美十日韩十国产 | 2020国产成人精品免费视频 | 奇米777四色影视在线看 | 男人与牛做爰的视频 | 香蕉人精品视频多人免费永久视频 | 国内精品一区二区 | 青草青青在线观看免费视频 | 中文字幕在线观看一区二区 | 国产精品久久久久久久久免费 | 在线播放国产一区二区三区 | 日日噜噜夜夜狠狠久久丁香 | 日韩视频一区二区三区 | 在线欧美69v免费观看视频 | 亚洲成a人片77777kkk | 国产精品亚洲专一区二区三区 | 天天操天天插天天射 | 国产精品福利尤物youwu | 国产精品成人观看视频国产 | 91最新免费观看在线 | 2021最新国产成人精品视频 | 四虎影院观看视频在线观看 | 伊人五月天婷婷琪琪综合 | 午夜时刻免费实验区观看 | 一级毛片一级毛片 | 欧美日韩另类综合 | 色狠狠狠色噜噜噜综合网 |