1 Runnable 介面
-
public interface Runnable
Runnable 介面應該由那些打算通過某一線程執行其執行個體的類來實現。類必須定義一個稱為 run 的無參數方法。
設計該介面的目的是為希望在活動時執行代碼的對象提供一個公用協議。例如,Thread 類實現了 Runnable。啟用的意思是說某個線程已啟動並且尚未停止。
此外,Runnable 為非 Thread 子類的類提供了一種啟用方式。通過執行個體化某個 Thread 執行個體並將自身作為運行目標,就可以運行實現 Runnable 的類而無需建立 Thread 的子類。大多數情況下,如果只想重寫 run() 方法,而不重寫其他 Thread 方法,那麼應使用 Runnable 介面。這很重要,因為除非程式員打算修改或增強類的基本行為,否則不應為該類建立子類。
2 Thread類
-
public class Thread
-
extends Object
-
implements Runnable
線程 是程式中的執行線程。JAVA 虛擬機器允許應用程式並發地運行多個執行線程。
每個線程都有一個優先順序,高優先順序線程的執行優先於低優先順序線程。每個線程都可以或不可以標記為一個精靈。當某個線程中啟動並執行代碼建立一個新 Thread 對象時,該新線程的初始優先順序被設定為建立線程的優先順序,並且若且唯若建立線程是守護線程時,新線程才是精靈。
當 JAVA 虛擬機器啟動時,通常都會有單個非守護線程(它通常會調用某個指定類的 main 方法)。JAVA 虛擬機器會繼續執行線程,直到下列任一情況出現時為止:
- 調用了
Runtime 類的 exit 方法,並且安全管理器允許退出操作發生。
- 非守護線程的所有線程都已停止運行,無論是通過從對 run 方法的調用中返回,還是通過拋出一個傳播到
run 方法之外的異常。
建立新執行線程有兩種方法。一種方法是將類聲明為 Thread 的子類。該子類應重寫 Thread 類的 run 方法。接下來可以分配並啟動該子類的執行個體。例如,計算大於某一規定值的質數的線程可以寫成:
class PrimeThread extends Thread { long minPrime; PrimeThread(long minPrime) { this.minPrime = minPrime; } public void run() { // compute primes larger than minPrime . . . } }
然後,下列代碼會建立並啟動一個線程:
PrimeThread p = new PrimeThread(143); p.start();
建立線程的另一種方法是聲明實現 Runnable 介面的類。該類然後實現 run 方法。然後可以分配該類的執行個體,在建立 Thread 時作為一個參數來傳遞並啟動。採用這種風格的同一個例子如下所示:
class PrimeRun implements Runnable { long minPrime; PrimeRun(long minPrime) { this.minPrime = minPrime; } public void run() { // compute primes larger than minPrime . . . } }
然後,下列代碼會建立並啟動一個線程:
PrimeRun p = new PrimeRun(143); new Thread(p).start();
每個線程都有一個標識名,多個線程可以同名。如果線程建立時沒有指定標識名,就會為其產生一個新名稱。