【问题标题】:Java Wake Sleeping ThreadJava 唤醒睡眠线程
【发布时间】:2014-07-29 11:19:17
【问题描述】:

我阅读了其他帖子,但没有找到我正在寻找的确切答案,所以我希望有人能给出一些澄清。

我有一个可以运行一段时间的程序。我有一些在后台运行的线程来执行各种任务,为了简单起见,让我们想想 3 个线程。 ThreadA 每 10 秒执行一次任务,ThreadB 每 30 秒执行一次任务,ThreadC 每 5 分钟执行一次任务。

我不使用忙等待,而是让线程在指定的时间内休眠。

我的问题是关于彻底关闭。我有一个变量,每个线程也具有读取访问权限,因此他们可以看到用户何时启动程序退出。下次线程处于活动状态时,它们会退出循环并加入,一切都很好。但是你可以看到 ThreadC 每 5 分钟才唤醒一次。

我的问题是我可以在睡眠时间结束之前向睡眠线程发出唤醒并退出的信号吗?如果这不可能,我是否需要重新编写代码以使用 wait()notify() 或者有更好的方法吗?

【问题讨论】:

    标签: java multithreading thread-sleep


    【解决方案1】:

    如果线程在睡眠期间被中断,Thread.sleep 将抛出 InterruptedException。抓住它,然后检查你的旗帜。

    【讨论】:

      【解决方案2】:

      您可以在您的线程上调用interrupt() 方法,并使您的线程从block state 转到running state,但它会抛出一个异常InterruptedException,届时您可以在catch

      另外一个解决方案是您可以使用 Timer Task,它会在您指定的特定时间调用 run 方法,而无需将您的线程放到 block state

      示例:

      public class TimerBomb {
        Toolkit toolkit;
      
        Timer timer;
        int count = 0;
      
        public TimerBomb(int seconds) {
          toolkit = Toolkit.getDefaultToolkit();
          timer = new Timer();
          timer.schedule(new RemindTask(), seconds * 1000, seconds*1000);
        }
      
        class RemindTask extends TimerTask {
          public void run() {
      
              //do stuff here 
      
          }
        }
      
        public static void main(String args[]) {
          System.out.println("About to schedule task.");
      
          Thread t = new Thread(new Runnable() {
      
              @Override
              public void run() {
                  new TimerBomb(5);
      
      
              }
          });
          t.start();
          System.out.println("Task scheduled.");
        }
      }
      

      它将永远每 5 秒运行一次。

      【讨论】:

      • “工具包”的目的是什么,取消计划任务的可能性在哪里?
      【解决方案3】:

      如果线程正在使用Thread.sleep(...) 休眠,您可以使用Thread.interrupt() 唤醒它们。确保在循环中处理 InterruptedException 和测试 Thread.currentThread().isInterrupted()

      【讨论】:

        【解决方案4】:

        您应该查看 ExecutorService 及其 shutdownNow() 方法(通常会中断所有活动线程)。你感觉到重新发明了调度轮子。

        【讨论】:

          【解决方案5】:

          所有其他答案都很好地回答了您实际提出的问题,但没有一个给出了您应该提出的问题的最佳答案。问题是,安排几个必须在不同时期重复的周期性任务的最佳方法是什么?答案是,使用 java.util.concurrent.ScheduledExecutorService。

          像所有的 ExeceuctorServices 一样,它提供了方法,shutdown() 和 shutdownNow(),当您希望任务停止时。

          【讨论】:

          • 您显然没有阅读“所有其他答案”。 David Ehrmann 比你早几个小时写了关于 ExecutorService 的文章。
          猜你喜欢
          • 1970-01-01
          • 2018-12-04
          • 1970-01-01
          • 1970-01-01
          • 2011-07-29
          • 1970-01-01
          • 1970-01-01
          • 2011-06-01
          • 2011-03-28
          相关资源
          最近更新 更多