从睡眠中唤醒线程

时间:2015-05-28 13:29:14

标签: java multithreading notify kill-process

我正在创建一个程序并且第一次使用详细信息处理线程并陷入困境。请帮助我。 我有一个处于等待状态的线程。现在我想杀死或唤醒线程并从另一个类恢复。为此我保存线程的对象。我不知道该怎么做。我试过通知线程但得到异常。这是我的代码:

第一课:

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();

我只想恢复或杀死线程。

3 个答案:

答案 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。