Java唤醒睡眠线程

时间:2014-06-08 22:17:11

标签: java multithreading thread-sleep

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

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

我没有使用忙碌的等待,并让线程在指定时间内休眠。

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

我的问题是,我可以通知睡眠线程在睡眠时间结束之前唤醒并退出吗?如果无法做到这一点,我是否需要重新编写代码才能使用wait()notify(),还是有更好的方法?

5 个答案:

答案 0 :(得分:10)

如果线程在睡眠期间中断,则

Thread.sleep抛出InterruptedException。抓住那个,检查你的旗帜。

答案 1 :(得分:5)

如果主题与Thread.sleep(...)一起休眠,您可以使用Thread.interrupt()将其唤醒。确保您在循环中处理InterruptedException并测试Thread.currentThread().isInterrupted()

答案 2 :(得分:3)

您可以在您的主题上调用interrupt()方法,并使您的主题从running state转到block state,但它会抛出InterruptedException的异常,然后你可以在catch

中关闭你的线程

另外一个解决方案是你可以使用Timer Task,它会在你指定的某个时间调用run方法,而不会将你的Thread放到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 :(得分:0)

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

答案 4 :(得分:0)

所有其他答案都是您实际问过的问题的良好答案,但没有一个能够为您应该提出的问题提供最佳答案。问题是,安排几个必须以不同时期重现的周期性任务的最佳方法是什么?答案是,使用java.util.concurrent.ScheduledExecutorService。

与所有ExeuctorServices一样,它提供了方法,shutdown()和shutdownNow(),用于何时停止任务。