【问题标题】:Awake thread from sleep从睡眠中唤醒线程
【发布时间】:2015-05-28 13:29:13
【问题描述】:

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

第一类:

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

我只想恢复或终止线程。

【问题讨论】:

  • 我猜你应该使用t.interrupt()
  • 这可能是 XY 问题的一个实例 (meta.stackexchange.com/questions/66377/what-is-the-xy-problem) 你真正的目标是什么?如果您想将消息从一个线程传递到另一个线程,那么也许您应该使用某种队列(例如,java.util.concurrent.SynchronousQueue 或 `java.util.concurrent.BlockingQueue)。

标签: java multithreading notify kill-process


【解决方案1】:

如果您的线程t 正在休眠,调用t.interrupt() 将导致调用Thread#sleep 的行抛出一个InterruptedException。它将被您的 catch 块捕获,您的线程将从那里继续进行清理并退出。

如果您的线程没有休眠或等待但仍想知道它是否被中断,则 Runnable 中的代码可以检查当前线程上的中断标志。请记住,一旦抛出 InterruptedException,中断标志就会重置。

Wait 和 notify 适用于在监视器上同步的线程,这不适用于您的示例。线程在监视器上等待并接收通知,但通知不是发给特定线程的;对于 Object#notify,选择了某个在该监视器上等待的线程,但调用 notify 的线程无法控制选择哪个。

这里是an example of using interrupt to wake a thread from sleeping。

【讨论】:

    【解决方案2】:

    您的线程在指定的时间内处于休眠状态。如果您只想“杀死它”并且不太关心以后会发生什么,请致电interrupt。你不能简单地从另一个线程“唤醒”它,如果它正在睡觉,它必须像被告知的那样睡觉。调用notify 与这种情况无关(之前没有wait 调用)。即使有,你也叫错了。

    【讨论】:

      【解决方案3】:

      在这种情况下您不使用通知。我建议阅读#wait/#notify/#notifyAll 上的JavaDoc

      您使用#notify 和#notifyAll 创建一个具有并发性的框架,例如在某个对象的实例上工作的线程,而其他线程正在等待处理它。

      如果 run 函数结束,线程会“死掉”,但如果要立即停止线程,请使用 #interrupt。

      【讨论】:

        猜你喜欢
        • 2018-12-04
        • 2014-07-29
        • 1970-01-01
        • 1970-01-01
        • 2011-07-29
        • 1970-01-01
        • 2011-06-01
        • 1970-01-01
        • 2011-03-28
        相关资源
        最近更新 更多