[Android面試]Java建立執行緒的兩種方式
簡介
Java提供了兩種建立執行緒方法:
1、通過實現Runable介面;
2、通過繼承Thread類本身
詳述
宣告實現 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();
將類宣告為 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();
當 Java 虛擬機器啟動時,通常都會有單個非守護執行緒(它通常會呼叫某個指定類的 main 方法)。Java 虛擬機器會繼續執行執行緒,直到下列任一情況出現時為止:
呼叫了 Runtime 類的 exit 方法,並且安全管理器允許退出操作發生。
- 非守護執行緒的所有執行緒都已停止執行,無論是通過從對 run 方法的呼叫中返回,還是通過丟擲一個傳播到 run 方法之外的異常。
使用和區別
Runable原始碼:
public interface Runnable { /** * When an object implementing interface <code>Runnable</code> is used * to create a thread, starting the thread causes the object's * <code>run</code> method to be called in that separately executing * thread. * <p> * The general contract of the method <code>run</code> is that it may * take any action whatsoever. * * @see java.lang.Thread#run() */ public abstract void run(); }
Thread 類實現了 Runnable。啟用的意思是說某個執行緒已啟動並且尚未停止。此外,Runnable 為非 Thread 子類的類提供了一種啟用方式。通過例項化某個 Thread 例項並將自身作為執行目標,就可以執行實現 Runnable 的類而無需建立 Thread 的子類。大多數情況下,如果只想重寫 run() 方法,而不重寫其他 Thread 方法,那麼應使用 Runnable 介面。這很重要,因為除非程式設計師打算修改或增強類的基本行為,否則不應為該類建立子類。
繼承Thread類實現多執行緒,要求放入多執行緒中的類不能繼承其他類(Java的單繼承特性),如果需要請用 Runnable 實現(介面可以多實現並不影響繼承其他類)。 一個實現Runnable介面的類可以放在多個執行緒中執行,多個執行緒可以去執行同一資源;而繼承Thread只能實現多個執行緒分別去處理自己的資源。(通過Runnable建立的多個執行緒可以由程式設計人員傳入同一個Runnable物件,即執行同一個run方法,而通過Thread建立的多執行緒它們執行的都是自己的run方法)。