我從一個主線程調用兩個線程,將它們稱爲線程1和線程2.當線程1停止時,我想要停止或終止線程2。我怎樣才能做到這一點?實際輸出有我想要的變化。那就是有一個主類,它也是線程。從主類我調用thread1和thread2.I給主線類的thread1輸入,但是當這個輸入發生變化時,我想殺死正在運行的thread1,並用另一個輸入再次啓動它。第二個線程thread2將以thread1給出的輸出運行。最終,當第一個線程被殺死時,第二個線程將運行但只有在該線程的輸入有效時纔會給出輸出。如何從Java中的另一個線程中殺死一個線程?
8
A
回答
13
Java已經廢棄了顯式殺死另一個線程(如Thread.stop/Thread.destroy)的方法。正確的方法是確保另一個線程上的操作可以處理被告知停止(例如,他們期望InterruptedException,這意味着您可以調用Thread.interrupt()來停止它)。
您可能還有興趣將第二個線程設置爲daemon thread,這意味着如果虛擬機中的所有其他線程都已完成,則該進程將退出。
2
根據these instructions,最好使用標誌變量來告訴其他線程乾淨地停止它的工作。
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;
}
相關問題
- 1. 一個線程如何在另一個線程中被殺死
- 2. 如何殺死線程從另一個線程在vala
- 3. 殺死另一個進程的線程
- 4. 在java中殺死一個線程android
- 5. 殺從另一個線程
- 6. 殺死一個線程
- 7. 殺死一個線程
- 8. 一個線程在iPhone應用程序中殺死另一個線程(兩個線程都是主線程)?
- 9. 如何從主線程突然殺死一個線程?
- 10. 如何殺死一個C#線程?
- 11. 如何殺死一個線程?
- 12. 在PropertyListener中殺死一個線程(JavaFX8)
- 13. 在SwingUtilities.invokeLater()中殺死一個線程
- 14. 用另一個超時線程殺死Boost線程
- 15. 在java中殺死線程
- 16. 殺死一個特定的線程Python
- 17. Boost,C++如何殺死由另一個線程打開的線程?
- 18. 從同一個進程中殺死一個進程及其所有線程
- 19. 殺死一個線程不起作用
- 20. 殺死一個線程或替代
- 21. 在Java中殺死一個不合作的線程
- 22. 在Android/Java中殺死一個*無響應的*線程
- 23. 如何殺死鍵盤上的一個子線程中斷
- 24. 使用Thread.interrupt在Java中殺死一個線程
- 25. ÇPthread的:通過擺好一個線程殺死其他線程
- 26. 有一個線程啓動另一個線程,然後死
- 27. 如何在C中處理/殺死一個鎖定線程#
- 28. 如何「殺死」從一個執行線程?
- 29. Java線程週期性地殺死一個過程
- 30. 如何從父線程中殺死子線程 - C
非常感謝您的建議,但是請您幫助我正確指定它。 – Raji