2010-03-22 130 views
5

如何殺死線程? ..... 如何在多線程中重新啓動它們?關於多線程

+0

有使用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 –

+1

解釋危險的實際頁面線程原語是http://java.sun.com/javase/6/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html – Will

+0

@chetans,你應該重寫這個,所以它更具體,更有意義。 – avpx

回答

2

我把我的工作線程放在自己的類中,並使用終止的屬性來終止線程處理循環。

對不起,我沒有一個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(); 
      } 

     } 

    } 
} 
3

Thread.stop()殺死一個線程,但你肯定不要想要這樣做(請參閱API文檔以獲得解釋爲什麼)。 Thread.interrupt()發送一個異步通知給線程,以便它可以正常關閉自己。

有關Java多線程的綜合文本,我推薦B. Goetz,Java併發實踐,Addison-Wesley Professional。

+5

Thread.stop()就像是把一輛汽車以60英里每小時的速度在公園停下來停下來...絕對停止它,但你會留下一個傷心的悲傷路徑一路上扭曲的金屬和你的車將永遠不會是相同的;-) –

+0

也Thread.interrupt不會總是中斷等待IO的線程。如果你認真對待中斷設計,你需要一種強制關閉任何IO流的方法,你的目標線程可能在等待 – radai

1

殺死線程的最好方法是爲要監視的線程設置一個標誌。當它看到該標誌設置爲true時,編程線程退出。沒有辦法重新啓動死亡的線程。

+0

....但你可以保存runnable本身以備後用 – radai

+2

殺死線程的最好方法是調用Thread.interrupt()並讓線程定期監視它的中斷狀態。添加另一個布爾值完全是多餘的。 – EJP

+0

除了EJP所說的,手卷國旗與執行者之間的關係並不好。 –

4

由於您的文章被標記爲「Java」,所以我對你在說什麼有個好主意。比方說,你做啓動一個線程:

Thread foo = new Thread(someRunnable); 
foo.start(); 

現在destroy和朋友都不贊成,你需要一種方法來殺死線程。幸運的是,總是有「中斷」的概念。只需改變你的runnable,以便在中斷時退出。然後調用線程的interrupt方法。

foo.interrupt(); 

如果您編寫了Runnable來正確處理它,它將停止正在進行的操作並終止它。

1

如果要啓動,停止,重新啓動隨意線程,也許使用Java 5的想法併發包將是一個好主意。你可以有一個Executor來完成一些工作,當你需要完成一些工作時,你可以重新安排它在執行器中完成。

3

用於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

0

關於對殺死線程第一個查詢:

您可以找到有關主題的更多細節在下面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細節看看:

How to properly use Java Executor?