後的JDK 7 Java文檔提出以下兩個成語來創建Java線程:設置一個Java線程的Runnable的建設
擴展Thread和覆蓋run()的
class PrimeThread extends Thread { long minPrime; PrimeThread(long minPrime) { this.minPrime = minPrime; } public void run() { // compute primes larger than minPrime . . . } } ... //And to launch the custom Thread PrimeThread p = new PrimeThread(143); p.start();
實現Runnable和創建一個將Runnable impl傳入其構造函數的新線程
class PrimeRun implements Runnable { long minPrime; PrimeRun(long minPrime) { this.minPrime = minPrime; } public void run() { // compute primes larger than minPrime . . . } } ... //And to launch a new Thread with this Runnable's behavior PrimeRun p = new PrimeRun(143); new Thread(p).start();
這些都很好,但我希望能夠創建Thread的子類,然後在稍後的某個時間定義並設置其Runnable實現(例如,不只是在線程的構造函數中)。從我可以告訴,Java的Thread類並沒有提供實現這個的手段,所以我想出了以下內容:
public class FlexiThread extends Thread{
//The Runnable impl to be executed
private Runnable mvRunner;
//Construct an empty subclass of Thread
public FlexiThread(){
super();
}
//Construct a subclass of Thread which provides
//its Runnable impl immediately
public FlexiThread(Runnable r){
super(r);
mvRunner = r;
}
/**
*
* @return -- the Runnable implementation whose
* run() method will be invoked when this thread
* is started
*/
public Runnable getRunnableToExecute(){
return mvRunner;
}
/**
* @param runner -- the Runnable implementation whose
* run() method will be invoked when this thread
* is started
*/
public void setRunnableToExecute(Runnable runner){
mvRunner = runner;
}
@Override
public void run(){
mvRunner.run();
}
}
我測試FlexiThread,它似乎按預期方式工作(它執行我給的任何代碼至少在Android ICS和JB上,Runnable impl的run方法在通過DDMS驗證的獨立執行線程中);使用上面給出的FlexiThread策略有沒有什麼錯誤/潛在危險/效率低下?如果是這樣,在構建Thread子類的Runnable之後定義一個更好的方法是什麼?
爲什麼要擴展'Thread'?爲什麼你不能只擴展'Runnable'? – Xeon
您的靈活和慣用的舊方式之間的真正區別是什麼?無論如何你需要在調用'start()'之前設置runnable。 –
AFAIK Android僅支持Java 6. –