日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

多线程——线程的生命周期

發(fā)布時(shí)間:2024/4/13 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多线程——线程的生命周期 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
線程狀態(tài): 與人有生老病死一樣,線程也同樣要經(jīng)歷新建、就緒、運(yùn)行(活動(dòng))、阻塞和死亡五種不同的狀態(tài)。這五種狀態(tài) 都可以通過(guò)Thread類(lèi)中的方法進(jìn)行控制。創(chuàng)建并運(yùn)行線程: ① 新建狀態(tài)(New Thread):在Java語(yǔ)言中使用new 操作符創(chuàng)建一個(gè)線程后,該線程僅僅是一個(gè)空對(duì)象, 它具備類(lèi)線程的一些特征,但此時(shí)系統(tǒng)沒(méi)有為其分配資源,這時(shí)的線程處于創(chuàng)建狀態(tài)。 線程處于創(chuàng)建狀態(tài)時(shí),可通過(guò)Thread類(lèi)的方法來(lái)設(shè)置各種屬性,如線程的優(yōu)先級(jí)(setPriority)、 線程名(setName)和線程的類(lèi)型(setDaemon)等。② 就緒狀態(tài)(Runnable):使用start()方法啟動(dòng)一個(gè)線程后,系統(tǒng)為該線程分配了除CPU外的所需資源, 使該線程處于就緒狀態(tài)。此外,如果某個(gè)線程執(zhí)行了yield()方法,那么該線程會(huì)被暫時(shí)剝奪CPU資源, 重新進(jìn)入就緒狀態(tài)。③ 運(yùn)行狀態(tài)(Running):Java運(yùn)行系統(tǒng)通過(guò)調(diào)度選中一個(gè)處于就緒狀態(tài)的線程,使其占有CPU并轉(zhuǎn)為運(yùn)行狀態(tài)。 此時(shí),系統(tǒng)真正執(zhí)行線程的run()方法。④ 阻塞和喚醒線程 阻塞狀態(tài)(Blocked):一個(gè)正在運(yùn)行的線程因某些原因不能繼續(xù)運(yùn)行時(shí),就進(jìn)入阻塞狀態(tài)。這些原因包括:a)當(dāng)執(zhí)行了某個(gè)線程對(duì)象的sleep()等阻塞類(lèi)型的方法時(shí),該線程對(duì)象會(huì)被置入一個(gè)阻塞集內(nèi),等待超時(shí)而自動(dòng)蘇醒。b) 當(dāng)多個(gè)線程試圖進(jìn)入某個(gè)同步區(qū)域時(shí),沒(méi)能進(jìn)入該同步區(qū)域的線程會(huì)被置入鎖定集,直到獲得該同步區(qū)域的鎖,進(jìn)入就緒狀態(tài)。c)當(dāng)線程執(zhí)行了某個(gè)對(duì)象的wait()方法時(shí),線程會(huì)被置入該對(duì)象的等待集中,直到執(zhí)行了該對(duì)象的notify()方法wait()/notify()方法的執(zhí)行要求線程首先獲得該對(duì)象的鎖。⑤ 死亡狀態(tài)(Dead):線程在run()方法執(zhí)行結(jié)束后進(jìn)入死亡狀態(tài)。此外,如果線程執(zhí)行了interrupt() 或stop()方法,那么它也會(huì)以異常退出的方式進(jìn)入死亡狀態(tài)。終止線程的三種方法 ① 使用退出標(biāo)志,使線程正常退出,也就是當(dāng)run方法完成后線程終止,推薦使用。 ② 使用stop方法強(qiáng)制終止線程(這個(gè)方法不推薦使用,因?yàn)閟top和suppend、resume一樣,也可能 發(fā)生不可預(yù)料的結(jié)果)。 ③ 使用interrupt方法中斷線程。

java多線程回顧2:生命周期與控制

1、 線程生命周期概述 線程的生命周期如下圖:

2、 新建與就緒當(dāng)程序使用new關(guān)鍵字創(chuàng)建一個(gè)線程之后,線程就處于新建狀態(tài)了。此時(shí)線程只是被分配了內(nèi)存資源, 初始化了成員變量。當(dāng)線程對(duì)象被調(diào)用了start()方法之后,該線程就處于就緒狀態(tài)了。表示這個(gè)線程可以運(yùn)行但還沒(méi)有運(yùn)行, 至于線程何時(shí)開(kāi)始運(yùn)行,取決于jvm的線程調(diào)度器。有一點(diǎn)值得注意,啟動(dòng)線程應(yīng)該使用start()方法,而不是run()方法。如果使用run()方法,程序會(huì)把 run()方法當(dāng)成一個(gè)普通方法立刻執(zhí)行,而不會(huì)啟動(dòng)新線程。此外,也不可以對(duì)已就緒的線程再次調(diào)用start()方法,會(huì)引發(fā)異常。3、 阻塞與運(yùn)行 當(dāng)就緒的線程獲得CPU資源開(kāi)始執(zhí)行方法體,該線程就變成運(yùn)行狀態(tài)。當(dāng)線程在運(yùn)行的過(guò)程中被中斷,則線程變?yōu)樽枞麪顟B(tài)。被阻塞的線程在合適的時(shí)候會(huì)重新進(jìn)入就緒狀態(tài), 然后再次獲取CPU資源,進(jìn)入運(yùn)行狀態(tài)。以下情況將使線程進(jìn)入阻塞狀態(tài): 線程調(diào)用sleep方法,主動(dòng)放棄所占CPU資源。 線程掉用了一個(gè)阻塞式IO方法,在方法返回前,線程被阻塞。 線程試圖獲取一個(gè)同步鎖,但是該鎖被其他線程占有。 線程在等待通知(線程同步notify) 線程調(diào)用suspend方法掛起。該方法容易死鎖,少用。以下情況將解除阻塞狀態(tài),使線程重新進(jìn)入就緒狀態(tài): sleep方法計(jì)時(shí)結(jié)束 阻塞式IO方法已經(jīng)返回 獲取了同步鎖 等到了其他線程發(fā)出的通知 調(diào)用resume方法解除了掛起狀態(tài)此外,調(diào)用yield方法可以使運(yùn)行狀態(tài)的線程直接轉(zhuǎn)入就緒狀態(tài)。4、 線程死亡 以下三種情況時(shí)線程將死亡。 run()方法執(zhí)行結(jié)束,線程結(jié)束。 線程拋出了一個(gè)未捕獲的Exception或Error 調(diào)用了線程的stop()方法。該方法容易死鎖,少用。5、線程控制 舉個(gè)例子,線程A在執(zhí)行中調(diào)用線程B的join方法,線程A將被阻塞,直到線程B執(zhí)行完為止。線程代碼如下: //通過(guò)實(shí)現(xiàn)Runnable接口創(chuàng)建線程類(lèi)public class ThreadTwo implements Runnable{private int i;//run方法同樣是線程的執(zhí)行體@Overridepublic void run() {for (i = 0; i < 5; i++) {//實(shí)現(xiàn)Runnable接口創(chuàng)建線程類(lèi)時(shí),只能使用Thread.currentThread()來(lái)獲取當(dāng)前線程System.out.println(Thread.currentThread().getName()+" "+i);}}}public class TestThreadJoin {public static void main(String[] args) throws InterruptedException {ThreadTwo st = new ThreadTwo();new Thread(st,"打醬油的線程").start();for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName()+" "+i);if (i==2) {ThreadTwo st2 = new ThreadTwo();Thread thread = new Thread(st2,"被join的線程");thread.start();//main線程調(diào)用了thread線程的join方法,必須等thread執(zhí)行結(jié)束才會(huì)向下執(zhí)行thread.join();}}}}main 0打醬油的線程 0main 1打醬油的線程 1main 2打醬油的線程 2打醬油的線程 3被join的線程 0打醬油的線程 4被join的線程 1被join的線程 2被join的線程 3被join的線程 4main 3main 4main 5main 6main線程的i等于2時(shí),啟動(dòng)了“被join的線程”,這時(shí)main線程進(jìn)入阻塞狀態(tài),只有“打醬油的線程”“ 被join的線程”在運(yùn)行,等“被join的線程”運(yùn)行完了,main線程才重新開(kāi)始運(yùn)行。5.2后臺(tái)線程 后臺(tái)線程也稱“守護(hù)線程”或“精靈線程”。jvm的垃圾回收線程就是典型的后臺(tái)進(jìn)程。一般線程在被創(chuàng)建之后,其生命周期是獨(dú)立的。而后臺(tái)進(jìn)程的生命周期與前臺(tái)進(jìn)程相關(guān):當(dāng)所有前臺(tái)進(jìn)程都 死亡,后臺(tái)進(jìn)程也隨之死亡。使用thread.setDaemon(true)可將線程設(shè)為后臺(tái)線程,且必須在線程啟動(dòng)前設(shè)置。前臺(tái)線程創(chuàng)建的線程默認(rèn)為前臺(tái)線程。后臺(tái)線程創(chuàng)建的線程默認(rèn)為后臺(tái)線程。5.3線程睡眠sleep Sleep方法是Thread類(lèi)提供的一個(gè)靜態(tài)方法,讓當(dāng)前線程進(jìn)入阻塞狀態(tài),時(shí)間到了之后,線程會(huì)自動(dòng)轉(zhuǎn)入 就緒狀態(tài)。5.4線程讓步y(tǒng)ield yield方法和sleep方法類(lèi)似,也是一個(gè)Thread類(lèi)提供的靜態(tài)方法,和sleep不同的是,yield是讓線程轉(zhuǎn)入 就緒狀態(tài)。 當(dāng)某個(gè)線程調(diào)用了yield方法后,和當(dāng)前線程優(yōu)先級(jí)一樣,或更高的線程會(huì)轉(zhuǎn)入運(yùn)行狀態(tài)。5.5線程優(yōu)先級(jí) Thread類(lèi)提供了setPriority(int newPriority)方法和getPriority()方法來(lái)設(shè)置和獲取線程優(yōu)先級(jí), 優(yōu)先級(jí)的范圍通常在1-10之間,10是最高優(yōu)先級(jí)。 不過(guò)不同系統(tǒng)的優(yōu)先級(jí)數(shù)值可能不同,所以通常推薦使用Thread類(lèi)的三個(gè)靜態(tài)常量來(lái)設(shè)置優(yōu)先級(jí), 分別是MAX_PRIORITY、MIN_PRIORITY、NORM_PRIORITY。

?

總結(jié)

以上是生活随笔為你收集整理的多线程——线程的生命周期的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。