2015-05-28 55 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