Java線程編程中的主線程講解
當(dāng)Java程序啟動(dòng)時(shí),一個(gè)線程立刻運(yùn)行,該線程通常叫做程序的主線程(main thread),因?yàn)樗浅绦蜷_(kāi)始時(shí)就執(zhí)行的。主線程的重要性體現(xiàn)在兩方面:
- 它是產(chǎn)生其他子線程的線程;
- 通常它必須最后完成執(zhí)行,因?yàn)樗鼒?zhí)行各種關(guān)閉動(dòng)作。
盡管主線程在程序啟動(dòng)時(shí)自動(dòng)創(chuàng)建,但它可以由一個(gè)Thread對(duì)象控制。為此,你必須調(diào)用方法currentThread()獲得它的一個(gè)引用,currentThread()是Thread類(lèi)的公有的靜態(tài)成員。它的通常形式如下:
static Thread currentThread( )
該方法返回一個(gè)調(diào)用它的線程的引用。一旦你獲得主線程的引用,你就可以像控制其他線程那樣控制主線程。
讓我們從復(fù)習(xí)下面例題開(kāi)始:
// Controlling the main Thread. class CurrentThreadDemo { public static void main(String args[]) { Thread t = Thread.currentThread(); System.out.println("Current thread: " + t); // change the name of the thread t.setName("My Thread"); System.out.println("After name change: " + t); try { for(int n = 5; n > 0; n--) { System.out.println(n); Thread.sleep(1000); } } catch (InterruptedException e) { System.out.println("Main thread interrupted"); } } }
在本程序中,當(dāng)前線程(自然是主線程)的引用通過(guò)調(diào)用currentThread()獲得,該引用保存在局部變量t中。然后,程序顯示了線程的信息。接著程序調(diào)用setName()改變線程的內(nèi)部名稱(chēng)。線程信息又被顯示。然后,一個(gè)循環(huán)數(shù)從5開(kāi)始遞減,每數(shù)一次暫停一秒。暫停是由sleep()方法來(lái)完成的。Sleep()語(yǔ)句明確規(guī)定延遲時(shí)間是1毫秒。注意循環(huán)外的try/catch塊。
Thread類(lèi)的sleep()方法可能引發(fā)一個(gè)InterruptedException異常。這種情形會(huì)在其他線程想要打攪沉睡線程時(shí)發(fā)生。本例只是打印了它是否被打斷的消息。在實(shí)際的程序中,你必須靈活處理此類(lèi)問(wèn)題。下面是本程序的輸出:
Current thread: Thread[main,5,main] After name change: Thread[My Thread,5,main] 5 4 3 2 1
注意t作為語(yǔ)句println()中參數(shù)運(yùn)用時(shí)輸出的產(chǎn)生。該顯示順序:線程名稱(chēng),優(yōu)先級(jí)以及組的名稱(chēng)。默認(rèn)情況下,主線程的名稱(chēng)是main。它的優(yōu)先級(jí)是5,這也是默認(rèn)值,main也是所屬線程組的名稱(chēng)。一個(gè)線程組(thread group)是一種將線程作為一個(gè)整體集合的狀態(tài)控制的數(shù)據(jù)結(jié)構(gòu)。這個(gè)過(guò)程由專(zhuān)有的運(yùn)行時(shí)環(huán)境來(lái)處理,在此就不贅述了。線程名改變后,t又被輸出。這次,顯示了新的線程名。
讓我們更仔細(xì)的研究程序中Thread類(lèi)定義的方法。sleep()方法按照毫秒級(jí)的時(shí)間指示使線程從被調(diào)用到掛起。它的通常形式如下:
static void sleep(long milliseconds) throws InterruptedException
掛起的時(shí)間被明確定義為毫秒。該方法可能引發(fā)InterruptedException異常。
sleep()方法還有第二種形式,顯示如下,該方法允許你指定時(shí)間是以毫秒還是以納秒為周期。
static void sleep(long milliseconds, int nanoseconds) throws InterruptedException
第二種形式僅當(dāng)允許以納秒為時(shí)間周期時(shí)可用。如上述程序所示,你可以用setName()設(shè)置線程名稱(chēng),用getName()來(lái)獲得線程名稱(chēng)(該過(guò)程在程序中沒(méi)有體現(xiàn))。這些方法都是Thread 類(lèi)的成員,聲明如下:
final void setName(String threadName) final String getName( )
這里,threadName 特指線程名稱(chēng)。
相關(guān)文章
Java多線程并發(fā)生產(chǎn)者消費(fèi)者設(shè)計(jì)模式實(shí)例解析
這篇文章主要介紹了Java多線程并發(fā)生產(chǎn)者消費(fèi)者設(shè)計(jì)模式實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03SpringCloud 搭建企業(yè)級(jí)開(kāi)發(fā)框架之實(shí)現(xiàn)多租戶(hù)多平臺(tái)短信通知服務(wù)(微服務(wù)實(shí)戰(zhàn))
這篇文章主要介紹了SpringCloud 搭建企業(yè)級(jí)開(kāi)發(fā)框架之實(shí)現(xiàn)多租戶(hù)多平臺(tái)短信通知服務(wù),系統(tǒng)可以支持多家云平臺(tái)提供的短信服務(wù)。這里以阿里云和騰訊云為例,集成短信通知服務(wù),需要的朋友可以參考下2021-11-11FP-Growth算法的Java實(shí)現(xiàn)+具體實(shí)現(xiàn)思路+代碼
FP-Growth算法比Apriori算法快很多(但是卻比不上時(shí)間,how time slipped away)。在網(wǎng)上搜索后發(fā)現(xiàn)Java實(shí)現(xiàn)的FP-Growth算法很少,且大多數(shù)不太能理解):太菜。所以就自己實(shí)現(xiàn)了一下。這篇文章重點(diǎn)介紹一下我的Java實(shí)現(xiàn)2021-06-06Java利用endorsed如何覆蓋jdk提供的類(lèi)詳解
這篇文章主要給大家介紹了關(guān)于Java利用endorsed如何覆蓋jdk提供的類(lèi)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09如何解決IDEA中JSP頁(yè)面部分出現(xiàn)綠色背景色問(wèn)題
這篇文章主要介紹了如何解決IDEA中JSP頁(yè)面部分出現(xiàn)綠色背景色問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12Javaweb mybatis接口開(kāi)發(fā)實(shí)現(xiàn)過(guò)程詳解
這篇文章主要介紹了Javaweb mybatis接口開(kāi)發(fā)實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07Intellij IDEA 如何通過(guò)數(shù)據(jù)庫(kù)表生成帶注解的實(shí)體類(lèi)(圖文詳細(xì)教程)
這篇文章主要介紹了Intellij IDEA 如何通過(guò)數(shù)據(jù)庫(kù)表生成帶注解的實(shí)體類(lèi)(圖文詳細(xì)教程),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11