我正在创建一个程序并且第一次使用详细信息处理线程并陷入困境。请帮助我。 我有一个处于等待状态的线程。现在我想杀死或唤醒线程并从另一个类恢复。为此我保存线程的对象。我不知道该怎么做。我试过通知线程但得到异常。这是我的代码:
第一课:
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();
我只想恢复或杀死线程。
答案 0 :(得分:1)
如果您的线程t
正在休眠,则调用t.interrupt()
将导致从调用Thread#sleep
的行抛出InterruptedException。它将被捕获到您的catch块中,您的线程将从那里继续进行清理并退出。
如果您的线程没有睡眠或等待但仍想知道它是否被中断的问题,则Runnable中的代码可以检查当前线程上的中断标志。请记住,一旦抛出InterruptedException,中断的标志就会被重置。
等待并通知适用于在监视器上同步的线程,这不适用于您的示例。线程在监视器上等待并接收通知,但通知不是针对特定线程的;对于Object#notify,某个在该监视器上等待的线程被选中,但调用notify的线程无法控制选择哪一个。
这是an example of using interrupt to wake a thread from sleeping。
答案 1 :(得分:0)
您的线程正在睡眠指定的时间。如果您只想“杀死它”并且您不太在意将来会发生什么,请在其上调用interrupt
。你不能简单地从另一个线程“唤醒它”,如果它正在睡觉它必须按照它被告知的那样睡觉。调用notify
与此情况无关(之前没有wait
调用)。即使这样做,你也会错误地调用它。
答案 2 :(得分:0)
在这种情况下,您不使用通知。我建议在#wait /#notify /#notifyAll
上阅读JavaDoc使用#notify和#notifyAll创建一个具有并发性的框架,例如一个Thread,它可以处理某个对象的实例,而其他线程正在等待它处理它。
线程"死亡"如果run函数结束,但是如果你想立即停止线程,请使用#interrupt。