2009-10-23 98 views
2

我用GUI做了一個java程序,我想要一個停止按鈕功能,當用戶點擊停止按鈕時,程序必須停止。如何在Java中停止線程?

  1. 在我的計劃中,主線程啓動其他10個線程,我想,只要停止按鈕被點擊的所有10個線程必須在主線程之前停止。

  2. 其次,我也想,只要這10個線程的任何線程停止時,必須先關閉它打開之前一樣連接到數據庫的所有資源等

我已經實現了代碼爲........

現在有一個問題。

我的Thread類是這樣的:

public class ParserThread implements Runnable { 
    private volatile boolean stopped = false; 

    public void stopTheThread() { 
     stopped = true; 
    } 
    : 
    : 
} 

而下面是從功能的start()

public class Main() { 
    Thread [] threads; 

    public void start() { 
     for(int i = 0; i < 10; i++) { 
      threads[i] = new Thread(new ParserThread()); 
     }  
    } 

    public void stop() { 
     // code to stop all the threads 
    } 
} 

現在,我要打電話的停止方法啓動10個線程的主線程ParserThread設置「stopped = true」來停止線程。我希望爲所有10個線程完成這件事。

我該如何調用停止方法。我希望它在Main類的stopAllThreads()方法中完成。

+0

見http://stackoverflow.com/questions/1611822/how-to-join-one-thread-with-other-in-java對這個問題進行的詳細信息。 – 2009-10-23 07:31:18

+0

您需要跟蹤ParserThread對象而不是線程,基本上 - 或者兩者兼而有之。只需要一個ParserThreads數組。 – 2009-10-23 13:31:56

+0

的[你如何殺死在Java中的線程?]可能的複製(http://stackoverflow.com/questions/671049/how-do-you-kill-a-thread-in-java) – Raedwald 2016-09-04 08:30:50

回答

8

一般來說,這樣做的方法是讓每個其他線程定期檢查一個標誌。經常後臺線程循環,等待工作 - 他們每次繞着一個循環都必須檢查標誌。如果他們使用Object.wait()或類似的東西被告知有更多的工作,則應該使用相同的通知來指示線程也應該停止。 (不要只是旋轉,直到你停下來 - 這將吸CPU,不要只使用睡眠 - 這將延遲終止。)

這使得所有的線程乾淨地終止,適當釋放資源。其他選項如interrupt()和不贊成使用的destroy()方法難以正確控制IMO。 (中斷一個線程比強制中止要好,但它有自己的問題 - 例如中斷只能在某些點處理。)

編輯:在代碼中,它看起來像這樣:

然後
// Client code 
for (Task task : tasks) { 
    task.stop(); 
} 

// Threading code 
public abstract class Task implements Runnable { 

    private volatile boolean stopped = false; 

    public void stop() { 
    stopped = true; 
    } 

    protected boolean shouldStop() { 
    return stopped; 
    } 

    public abstract void run(); 
} 

你的任務將繼承Task。如果您想要stop()方法也可以通知監視器,則需要稍微複雜一點,但這是基本思路。

樣的任務:

public class SomeTask extends Task { 
    public void run() { 
    while (!shouldStop()) { 
     // Do work 
    } 
    } 
} 
+0

能否請您解釋一下在語法上。我怎樣才能在我的程序中實現它。您可以在http://stackoverflow.com/questions/1611822/how-to-join-one-thread-with-other-in-java – 2009-10-23 07:35:01

+1

「定期檢查標誌」看看我的程序的一部分,也稱爲「主動等待」而不是推薦。使用等待/通知來避免這種情況。 – pimpf0r 2009-10-23 07:40:44

+1

@ pimpf0r:您只需要使用等待/通知,如果你轉動或睡覺。如果你有一個持續不斷的工作流,那很好。請注意,我已經提到如果你想要睡覺,在回答中使用wait()。 – 2009-10-23 07:44:14

-1

有具有標誌線是否應該停止或不是一個控制器對象,每個線程週期性和出口檢查控制器如果點擊停止按鈕(例如,如果您正在傳送一個文件,然後每個塊收到/發送後,檢查是否停止點擊)。

+1

遲到,幾乎與以前的答案相同。 – 2012-01-26 08:37:09

0

我不認爲答案可以解決問題。這裏的代碼:

public class SomeTask extends Task { 
    public void run() { 
     while (!shouldStop()) { 
     // Do work 
     } 
    } 
    } 

但如何處理,如果「做工作」掛,不回來嗎?在這種情況下,雖然不能檢查標誌。線程仍然無法停止。

的可能的解決方案,這可能是使用工藝。