2012-04-18 215 views
4

我有一個應用程序,我需要在3個獨立的線程中調用3個方法,然後殺死它們。據Javadoc我注意到線程stop(),甚至destroy()已被棄用。它就像我一個接一個地開始一個線程,然後一個接一個地類似地殺死。有沒有特定的方法來殺死線程,因爲我不能使用已棄用的方法在java中殺死一個線程android

任何幫助非常感謝。 再次感謝

+1

你不能等待他們完成使用'Thread.join()'? – hmjd 2012-04-18 10:44:59

+2

退一步說,你是否真的需要自己的線程,或者你可以通過[Executor]使用線程池(http://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html )? – weston 2012-04-18 10:58:30

+2

... Android的線程池執行程序參考:http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html – weston 2012-04-18 11:05:49

回答

3

你不殺死線程。您可以撥打Thread.interrupt(),然後對正在中斷的線程內的interrupted狀態或InterruptedException作出反應。或者,您使用volatile標誌。有關背景和更多信息,請參見the official documentation

更好的是,使用線程池/執行程序而不是原始線程,如註釋中所示。

+2

在weston和Joolan發表的意見之後,我發現使用線程池非常重要因爲它減少了一個接一個地啓動線程的開銷。我找到了一個很好的例子,並熟悉這一點,對任何人都會有幫助。因此這裏是它的一個實例 http://apachejava.blogspot.co.uk/2010/03/java-thread-pool-easy-tutorial.html 我已經接受Joolans的回答,甚至westons評論幫助我通過線程池讀取 – rosesr 2012-04-18 11:52:39

0

以一種無處不在的方式終結一個流氓線程幾乎是不可能的。

如果您可以控制正在運行的線程的源代碼,則必須添加一個方法,在需要時可以使用該方法停止該線程。基本上這個方法改變了一個布爾變量,線程會定期檢查這個值,看看它是否可以繼續。

public class MyTask implements Runnable { 
    // Set this to true when thread must stop. 
    private boolean mStopRequested = false; 
    public void run() { 
     while (mStopRequested == false) { 
      // ... 
     } 
    } 
} 

如果調用第三方庫不提供這樣的方法,那麼你的運氣,他們不得不求助於醜組裝機。一旦我必須通過刪除庫訪問的文件(它拋出FileNotFoundException並退出)來殺死長時間運行的第三方庫調用。這隻適用於Unix系統。

您的里程將有所不同。

0

使用連接方法,直到接收者完成其執行並死亡或指定的超時到期,無論先發生什麼。

thread1.join(1); 
thread2.join(2); 
thread3.join(3); 

您必須處理該異常。