java語言

當前位置 /首頁/計算機/java語言/列表

舉例講解Java中的多執行緒範文欣賞

舉例講解Java中的多執行緒

舉例講解Java中的多執行緒範文欣賞

Java建立執行緒(Runnable介面和Thread類)

大多數情況,通過例項化一個Thread物件來建立一個執行緒。Java定義了兩種方式:

實現Runnable 介面; 可以繼承Thread類。

下面的依次介紹了每一種方式。

實現Runnable介面

建立執行緒的最簡單的方法就是建立一個實現Runnable 介面的類。Runnable抽象了一個執行程式碼單元。你可以通過實現Runnable介面的方法建立每一個物件的執行緒。為實現Runnable 介面,一個類僅需實現一個run()的簡單方法,該方法宣告如下:

public void run( )

在run()中可以定義程式碼來構建新的執行緒。理解下面內容是至關重要的:run()方法能夠像主執行緒那樣呼叫其他方法,引用其他類,宣告變數。僅有的不同是run()在程式中確立另一個併發的執行緒執行入口。當run()返回時,該執行緒結束。

在你已經建立了實現Runnable介面的類以後,你要在類內部例項化一個Thread類的物件。Thread 類定義了好幾種建構函式。我們會用到的如下:

Thread(Runnable threadOb, String threadName)

該建構函式中,threadOb是一個實現Runnable介面類的例項。這定義了執行緒執行的起點。新執行緒的名稱由threadName定義。

建立新的執行緒後,它並不執行直到呼叫了它的start()方法,該方法在Thread 類中定義。本質上,start() 執行的是一個對run()的呼叫。 Start()方法宣告如下:

void start( )

下面的例子是建立一個新的執行緒並啟動它執行:

// Create a second s NewThread implements Runnable { Thread t; NewThread() { // Create a new, second thread t = new Thread(this, "Demo Thread"); tln("Child thread: " + t); t(); // Start the thread } // This is the entry point for the second thread. public void run() { try { for(int i = 5; i > 0; i--) { tln("Child Thread: " + i); p(500); } } catch (InterruptedException e) { tln("Child interrupted."); } tln("Exiting child thread."); }}class ThreadDemo { public static void main(String args[]) { new NewThread(); // create a new thread try { for(int i = 5; i > 0; i--) { tln("Main Thread: " + i); p(1000); } } catch (InterruptedException e) { tln("Main thread interrupted."); } tln("Main thread exiting."); }}

在NewThread 建構函式中,新的Thread物件由下面的語句建立::

t = new Thread(this, "Demo Thread");

通過前面的語句this 表明在this物件中你想要新的執行緒呼叫run()方法。然後,start() 被呼叫,以run()方法為開始啟動了執行緒的執行。這使子執行緒for 迴圈開始執行。呼叫start()之後,NewThread 的.建構函式返回到main()。當主執行緒被恢復,它到達for 迴圈。兩個執行緒繼續執行,共享CPU,直到它們的迴圈結束。該程式的輸出如下:

Child thread: Thread[Demo Thread,5,main]Main Thread: 5Child Thread: 5Child Thread: 4Main Thread: 4Child Thread: 3Child Thread: 2Main Thread: 3Child Thread: 1Exiting child Thread: 2Main Thread: 1Main thread exiting.

如前面提到的,在多執行緒程式中,通常主執行緒必須是結束執行的最後一個執行緒。實際上,一些老的JVM,如果主執行緒先於子執行緒結束,Java的執行時間系統就可能“掛起”。前述程式保證了主執行緒最後結束,因為主執行緒沉睡週期1000毫秒,而子執行緒僅為500毫秒。這就使子執行緒在主執行緒結束之前先結束。簡而言之,你將看到等待執行緒結束的更好途徑。

擴充套件Thread

建立執行緒的另一個途徑是建立一個新類來擴充套件Thread類,然後建立該類的例項。當一個類繼承Thread時,它必須過載run()方法,這個run()方法是新執行緒的入口。它也必須呼叫start()方法去啟動新執行緒執行。下面用擴充套件thread類重寫前面的程式:

// Create a second thread by extending Threadclass NewThread extends Thread { NewThread() { // Create a new, second thread super("Demo Thread"); tln("Child thread: " + this); start(); // Start the thread } // This is the entry point for the second thread. public void run() { try { for(int i = 5; i > 0; i--) { tln("Child Thread: " + i); p(500); } } catch (InterruptedException e) { tln("Child interrupted."); } tln("Exiting child thread."); }}class ExtendThread { public static void main(String args[]) { new NewThread(); // create a new thread try { for(int i = 5; i > 0; i--) { tln("Main Thread: " + i); p(1000); } } catch (InterruptedException e) { tln("Main thread interrupted."); } tln("Main thread exiting."); }}

該程式生成和前述版本相同的輸出。子執行緒是由例項化NewThread物件生成的,該物件從Thread類派生。注意NewThread 中super()的呼叫。該方法呼叫了下列形式的Thread建構函式:

public Thread(String threadName)

這裡,threadName指定執行緒名稱。

選擇合適方法

到這裡,你一定會奇怪為什麼Java有兩種建立子執行緒的方法,哪一種更好呢。所有的問題都歸於一點。Thread類定義了多種方法可以被派生類過載。對於所有的方法,惟一的必須被過載的是run()方法。這當然是實現Runnable介面所需的同樣的方法。很多Java程式設計師認為類僅在它們被加強或修改時應該被擴充套件。因此,如果你不過載Thread的其他方法時,最好只實現Runnable 介面。這當然由你決定。然而,在本章的其他部分,我們應用實現runnable介面的類來建立執行緒。