2013-04-05 29 views
5

我一直在尋找方法來殺死一個線程,看來這是最流行的方法替代方法殺死線程

public class UsingFlagToShutdownThread extends Thread { 
    private boolean running = true; 
    public void run() { 
    while (running) { 
     System.out.print("."); 
     System.out.flush(); 
     try { 
     Thread.sleep(1000); 
     } catch (InterruptedException ex) {} 
    } 
    System.out.println("Shutting down thread"); 
    } 
    public void shutdown() { 
    running = false; 
    } 
    public static void main(String[] args) 
     throws InterruptedException { 
    UsingFlagToShutdownThread t = new UsingFlagToShutdownThread(); 
    t.start(); 
    Thread.sleep(5000); 
    t.shutdown(); 
    } 
} 

但是,如果在while循環中,我們產生另一個而它與填充另一個對象數據(比如正在運行和更新的gui),那麼我們如何回調 - 特別是考慮到這種方法可能會被多次調用,所以我們有很多線程,而while(running)然後改變標誌爲一個會改變它爲每個人?

謝謝

+4

**沒有一個解決方案,但最佳實踐:**聲明你的標誌'running'爲'volatile'。 – 2013-04-05 14:48:45

+0

線程查殺的最佳方法是不要嘗試。如果有任何方法可以設計應用程序,以便線程無需在操作系統在進程終止時殺死線程時被殺死,那麼您應該這樣做。 – 2013-04-05 14:56:53

+0

但如果run方法有無限循環,即使關閉了gui線程正在將數據抽入,它仍然不會死亡:( – Biscuit128 2013-04-05 14:57:59

回答

2

解決這些問題的一種方法是擁有一個Monitor類來處理所有的線程。它可以啓動所有必要的線程(可能在不同的時間/必要時),一旦你想關閉,你可以調用一個關閉方法來中斷所有(或某些)線程。

另外,實際上調用Thread s interrupt()方法通常是一個更好的方法,因爲它會擺脫阻塞動作,拋出InterruptedException(例如等待/睡眠)。然後,它會設置一個標誌,已經存在的線程(可以用isInterrupted()檢查或檢查,並與interrupted()清除例如下面的代碼可以取代當前的代碼:

public class UsingFlagToShutdownThread extends Thread { 
    public void run() { 
    while (!isInterrupted()) { 
     System.out.print("."); 
     System.out.flush(); 
     try { 
     Thread.sleep(1000); 
     } catch (InterruptedException ex) { interrupt(); } 
    } 
    System.out.println("Shutting down thread"); 
    } 
    public static void main(String[] args) 
     throws InterruptedException { 
    UsingFlagToShutdownThread t = new UsingFlagToShutdownThread(); 
    t.start(); 
    Thread.sleep(5000); 
    t.interrupt(); 
    } 
} 
+2

你的意思是'while(!isInterrupted()) '? – z5h 2013-04-05 15:11:29

+0

當然,謝謝! – ddmps 2013-04-05 21:13:08

+1

這是一本名爲'Java Concurrency in Practice'的書中推薦的方法,由JDK併發設計師(Tim Peierls Joshua Bloch Joseph Bowbeer David Holmes和Doug Lea)共同撰寫。 .stop'絕對是depreca特德。 – 2013-04-06 05:41:17

0

我添加了一個utlility類本質上有一個靜態地圖和方法

該地圖的類型是Long id, Thread thread。我添加了兩個方法一個添加到地圖和一個停止線程通過使用中斷此方法採用id作爲參數。

我也改變了我的循環邏輯while真的,同時! isInterrupted。這是方法確定,或者這是一種不好的編程風格/公約

感謝