- 相關(guān)推薦
Java線(xiàn)程編程中的主線(xiàn)程詳細介紹
當Java程序啟動(dòng)時(shí),一個(gè)線(xiàn)程立刻運行,該線(xiàn)程通常叫做程序的主線(xiàn)程(main thread),因為它是程序開(kāi)始時(shí)就執行的。主線(xiàn)程的重要性體現在兩方面:
它是產(chǎn)生其他子線(xiàn)程的線(xiàn)程;
通常它必須最后完成執行,因為它執行各種關(guān)閉動(dòng)作。
盡管主線(xiàn)程在程序啟動(dòng)時(shí)自動(dòng)創(chuàng )建,但它可以由一個(gè)Thread對象控制。為此,你必須調用方法currentThread()獲得它的一個(gè)引用,currentThread()是Thread類(lèi)的公有的靜態(tài)成員。它的通常形式如下:
?
1 | static Thread currentThread( ) |
該方法返回一個(gè)調用它的線(xiàn)程的引用。一旦你獲得主線(xiàn)程的引用,你就可以像控制其他線(xiàn)程那樣控制主線(xiàn)程。
讓我們從復習下面例題開(kāi)始:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | // 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"); } }} |
在本程序中,當前線(xiàn)程(自然是主線(xiàn)程)的引用通過(guò)調用currentThread()獲得,該引用保存在局部變量t中。然后,程序顯示了線(xiàn)程的信息。接著(zhù)程序調用setName()改變線(xiàn)程的內部名稱(chēng)。線(xiàn)程信息又被顯示。然后,一個(gè)循環(huán)數從5開(kāi)始遞減,每數一次暫停一秒。暫停是由sleep()方法來(lái)完成的。Sleep()語(yǔ)句明確規定延遲時(shí)間是1毫秒。注意循環(huán)外的try/catch塊。
Thread類(lèi)的sleep()方法可能引發(fā)一個(gè)InterruptedException異常。這種情形會(huì )在其他線(xiàn)程想要打攪沉睡線(xiàn)程時(shí)發(fā)生。本例只是打印了它是否被打斷的消息。在實(shí)際的程序中,你必須靈活處理此類(lèi)問(wèn)題。下面是本程序的輸出:
?
1 2 3 4 5 6 7 | Current thread: Thread[main,5,main]After name change: Thread[My Thread,5,main]54321 |
注意t作為語(yǔ)句println()中參數運用時(shí)輸出的產(chǎn)生。該顯示順序:線(xiàn)程名稱(chēng),優(yōu)先級以及組的名稱(chēng)。默認情況下,主線(xiàn)程的名稱(chēng)是main。它的優(yōu)先級是5,這也是默認值,main也是所屬線(xiàn)程組的名稱(chēng)。一個(gè)線(xiàn)程組(thread group)是一種將線(xiàn)程作為一個(gè)整體集合的狀態(tài)控制的數據結構。這個(gè)過(guò)程由專(zhuān)有的運行時(shí)環(huán)境來(lái)處理,在此就不贅述了。線(xiàn)程名改變后,t又被輸出。這次,顯示了新的線(xiàn)程名。
讓我們更仔細的研究程序中Thread類(lèi)定義的方法。sleep()方法按照毫秒級的時(shí)間指示使線(xiàn)程從被調用到掛起。它的通常形式如下:
?
1 | static void sleep(long milliseconds) throws InterruptedException |
掛起的時(shí)間被明確定義為毫秒。該方法可能引發(fā)InterruptedException異常。
sleep()方法還有第二種形式,顯示如下,該方法允許你指定時(shí)間是以毫秒還是以納秒為周期。
?
1 | static void sleep(long milliseconds, int nanoseconds) throws InterruptedException |
第二種形式僅當允許以納秒為時(shí)間周期時(shí)可用。如上述程序所示,你可以用setName()設置線(xiàn)程名稱(chēng),用getName()來(lái)獲得線(xiàn)程名稱(chēng)(該過(guò)程在程序中沒(méi)有體現)。這些方法都是Thread 類(lèi)的成員,聲明如下:
?
1 2 | final void setName(String threadName)final String getName( ) |
這里,threadName 特指線(xiàn)程名稱(chēng)。
【Java線(xiàn)程編程中的主線(xiàn)程詳細介紹】相關(guān)文章:
java多線(xiàn)程-線(xiàn)程通信實(shí)例詳細解讀07-07
java多線(xiàn)程介紹08-23
JAVA中終止線(xiàn)程的方法08-12
java中如何停止線(xiàn)程08-14
Java多線(xiàn)程的線(xiàn)程守護例子06-08
java的多線(xiàn)程09-09
java多線(xiàn)程08-31
簡(jiǎn)單地分析Java線(xiàn)程編程中ThreadLocal類(lèi)的使用08-10
Java多線(xiàn)程的用法介紹09-15