如何殺死線程? ..... 如何在多線程中重新啓動它們?關於多線程
關於多線程
回答
我把我的工作線程放在自己的類中,並使用終止的屬性來終止線程處理循環。
對不起,我沒有一個Java版本,現在出手,但你應該從這個 http://pastie.org/880516
using System.Threading;
namespace LoaderDemo
{
class ParserThread
{
private bool m_Terminated;
private AutoResetEvent m_Signal;
private string m_FilePath;
...
public ParserThread(AutoResetEvent signal, string filePath)
{
m_Signal = signal;
m_FilePath = filePath;
Thread thrd = new Thread(this.ThreadProc);
thrd.Start();
}
public bool Terminated {
set { m_Terminated = value; }
}
private Guid Parse(ref string s)
{
//parse the string s and return a populated Guid object
Guid g = new Guid();
// do stuff...
return g;
}
private void ThreadProc()
{
TextReader tr = null;
string line = null;
int lines = 0;
try
{
tr = new StreamReader(m_FilePath);
while ((line = tr.ReadLine()) != null)
{
if (m_Terminated) break;
Guid g = Parse(ref line);
m_GuidList.Add(g);
lines++;
}
m_Signal.Set(); //signal done
}
finally
{
tr.Close();
}
}
}
}
Thread.stop()
殺死一個線程,但你肯定不要想要這樣做(請參閱API文檔以獲得解釋爲什麼)。 Thread.interrupt()
發送一個異步通知給線程,以便它可以正常關閉自己。
有關Java多線程的綜合文本,我推薦B. Goetz,Java併發實踐,Addison-Wesley Professional。
Thread.stop()就像是把一輛汽車以60英里每小時的速度在公園停下來停下來...絕對停止它,但你會留下一個傷心的悲傷路徑一路上扭曲的金屬和你的車將永遠不會是相同的;-) –
也Thread.interrupt不會總是中斷等待IO的線程。如果你認真對待中斷設計,你需要一種強制關閉任何IO流的方法,你的目標線程可能在等待 – radai
由於您的文章被標記爲「Java」,所以我對你在說什麼有個好主意。比方說,你做啓動一個線程:
Thread foo = new Thread(someRunnable);
foo.start();
現在destroy
和朋友都不贊成,你需要一種方法來殺死線程。幸運的是,總是有「中斷」的概念。只需改變你的runnable,以便在中斷時退出。然後調用線程的interrupt
方法。
foo.interrupt();
如果您編寫了Runnable來正確處理它,它將停止正在進行的操作並終止它。
如果要啓動,停止,重新啓動隨意線程,也許使用Java 5的想法併發包將是一個好主意。你可以有一個Executor來完成一些工作,當你需要完成一些工作時,你可以重新安排它在執行器中完成。
用於Thread
死的首選方法是爲run
方法的執行去完成:
Thread t = new Thread(new Runnable() {
public void run() {
// Do something...
// Thread will end gracefully here.
}
}
一旦線程在上面的例子中正常死亡,Thread
無法重新啓動。 (試圖調用Thread.start
對已經啓動將導致IllegalThreadStateException
線程)。
在這種情況下,可以使線程的另一個實例,並調用該start
。
從The Java Tutorials可能獲得更多關於線程信息的好地方是Lesson: Concurrency。
關於對殺死線程第一個查詢:
您可以找到有關主題的更多細節在下面SE問題:
How to properly stop the Thread in Java?
How can I kill a thread? without using stop();
How to start/stop/restart a thread in Java?
關於你的第二個重新啓動線程的查詢,這在java中是不可能的。
您可以找到以下細節文檔page
公共無效的start()
使該線程開始執行; Java虛擬機會調用此線程的運行方法。
結果是兩個線程同時運行:當前線程(從調用返回到start方法)和另一個線程(它執行其運行方法)。
不止一次啓動線程是合法的。特別是,線程一旦完成執行就不會重新啓動。
您可以使用高級併發API進行線程生命週期管理,而不是使用普通線程。在這個職位的ExecutorService細節看看:
- 1. 關於多線程
- 2. 關於多線程
- 3. 關於多線程的java多線程
- 4. 關於多線程程序的查詢
- 5. 關於線程
- 6. 關於線程
- 7. 關於線程
- 8. 關於集合的多線程問題
- 9. 關於多線程和EntityManager的問題
- 10. 關於iPhone上的多線程
- 11. 關於多核進程怪異結果的多線程
- 12. 需要關於多線程線程,單個工作線程模型的建議
- 13. 用於多線程
- 14. Java多線程未關閉線程
- 15. 關於線程的術語
- 16. 關於線程的問題
- 17. 關於線程安全
- 18. 關於線程安全
- 19. 關於並行POSIX線程
- 20. 關於線程退出
- 21. 關於線程的困惑
- 22. 關於線程的加入
- 23. 關於線程的問題
- 24. 關於Python中的線程
- 25. 關於.NET中的線程
- 26. 關於Linux中的線程
- 27. 關於c中的線程#
- 28. 關閉多線程NSDocument
- 29. 關於在jdbc中使用多線程的教程
- 30. 需要關於c#中多線程應用程序的指導。
有使用Thread.stop():http://java.sun.com/javase/6/docs/api/java/lang/Thread。 html#stop(),但不建議你這麼做:http://java.sun.com/javase/6/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html –
解釋危險的實際頁面線程原語是http://java.sun.com/javase/6/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html – Will
@chetans,你應該重寫這個,所以它更具體,更有意義。 – avpx