2009-11-05 87 views
8

我從一個主線程調用兩個線程,將它們稱爲線程1和線程2.當線程1停止時,我想要停止或終止線程2。我怎樣才能做到這一點?實際輸出有我想要的變化。那就是有一個主類,它也是線程。從主類我調用thread1和thread2.I給主線類的thread1輸入,但是當這個輸入發生變化時,我想殺死正在運行的thread1,並用另一個輸入再次啓動它。第二個線程thread2將以thread1給出的輸出運行。最終,當第一個線程被殺死時,第二個線程將運行但只有在該線程的輸入有效時纔會給出輸出。如何從Java中的另一個線程中殺死一個線程?

回答

13

Java已經廢棄了顯式殺死另一個線程(如Thread.stop/Thread.destroy)的方法。正確的方法是確保另一個線程上的操作可以處理被告知停止(例如,他們期望InterruptedException,這意味着您可以調用Thread.interrupt()來停止它)。

您可能還有興趣將第二個線程設置爲daemon thread,這意味着如果虛擬機中的所有其他線程都已完成,則該進程將退出。

2

根據these instructions,最好使用標誌變量來告訴其他線程乾淨地停止它的工作。

+0

非常感謝您的建議,但是請您幫助我正確指定它。 – Raji

6

請參閱this Java Specialist article關於如何幹淨地關閉線程。

簡而言之,文章建議Thread.interrupt()加上適當的InterruptedException在線程代碼處理。這本身就是一個有趣的討論,而且我很少看到正確的做法。

+1

該文章是一篇很棒的閱讀材料,並且建議任何人沒有足夠的時間閱讀Doug Lea的Java併發編程 – abyx

1

在線程的run()方法中,當您要停止線程時,請檢查通過訪問方法(如shutdown())設置的屬性,並使用該值結束while循環。例如:

boolean stopping = false; 

Thread currentThread = null; 

public void run() { 

    currentThread = Thread.currentThread(); 

    while (!isStopping()) { 

     // do something, sleep a while 
    } 
} 

public synchronized void shutdown() { 

    stopping = true; 

    currentThread.notifyAll(); 
} 

public synchronized boolean isStopping() { 

    return stopping; 
} 
+0

您的代碼有競爭條件,並且您的同步使用很差。它更好地簡單地檢查當前線程的中斷狀態,或者如果你必須使用某種標記,至少使它成爲原子。 – Kevin

+0

@凱文,你一定錯過了*例如*位,這段代碼顯然只是爲了顯示解決方案的結構 - 不能按原樣使用。 – rsp

+1

@rsp:如果你發佈的例子,最好讓他們成爲很好的例子。如果人們已經知道區分好壞例子,他們就不必在這裏問了。 –