2015-05-28 22 views
1

我正在創建一個程序,並首次使用細節中的線程,並陷入了一種情況。請幫助我。 我有一個處於等待狀態的線程。現在在某些情況下,我想要殺死或喚醒線程並從另一個類繼續。爲此,我保存了線程對象。我不知道如何執行此操作。試圖通知線程,但得到exception.Here是我的代碼:從睡夢中醒來的線程

類別之一:

Thread t= new Thread(new Runnable() {  
    @Override 
    public void run() { 
     try{ 
      Thread.sleep(VariableClass.THREAD_WAIT_SECONDS); 
      if(message !=null) 
      message_status = message.getStatus(); 
     } 
     catch(InterruptedException e) 
     { 
      e.printStackTrace(); 
     } 
     //do other stuff and save the thread object 
     VariableClass.threads.remove(message.getUniqueId()); 
    } 
}); 
t.start(); 
VariableClass.threads.put(pojo.getUniqueId(),t); 

類二:

Thread t =VariableClass.threads.get(tempId); 
t.notify(); 

我只是想恢復或殺死線程。

+1

我想你應該使用't.interrupt()' – SpaceTrucker

+1

這可能是一個XY問題的實例(http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)你真正的目標是什麼?如果你想從一個線程傳遞消息到另一個線程,那麼你可能應該使用某種類型的隊列(例如java.util.concurrent.SynchronousQueue或java.util.concurrent.BlockingQueue)。 –

回答

0

您的線程正在睡眠指定的時間。打電話給interrupt,如果你只是想「殺了它」,你不會太在意它後面會發生什麼。你不能簡單地從另一個線程「喚醒它」,如果它正在睡覺,它必須按照它所告知的那樣睡眠。調用notify與這種情況無關(前面沒有wait調用)。即使如此,你也是錯誤地稱呼它。

0

在這種情況下,您不使用通知。我建議閱讀JavaDoc on#wait /#notify /#notifyAll

您可以使用#notify和#notifyAll創建一個具有併發性的框架,例如可以在某個對象的實例上工作的線程,並且其他線程正在等待在它上面工作。

如果運行函數結束,則線程「死掉」,但如果要立即停止線程,請使用#interrupt。

1

如果您的線程t正在休眠,調用t.interrupt()將導致從調用Thread#sleep的行中拋出InterruptedException。它會被抓到你的catch塊中,你的線程將從那裏進行清理並退出。

如果您的線程未處於睡眠或等待狀態但仍想知道是否被中斷,Runnable中的代碼可以檢查當前線程中的中斷標誌。請記住,一旦拋出InterruptedException,中斷標誌就會重置。

等待和通知是在監視器上同步的線程,這不適用於您的示例。線程在顯示器上等待並接收通知,但通知不是針對特定線程的;對於Object#notify,在監視器上等待的某個線程被選中,但線程調用notify並不能控制選擇哪個線程。

這是an example of using interrupt to wake a thread from sleeping