我做了一些其他帖子的阅读,但没有找到我正在寻找的确切答案,所以我希望有人能给出一些澄清。
我有一个会运行一段时间的程序。我有一些在后台运行的线程执行各种任务,为了保持简单,我们可以想到3个线程。 ThreadA
每10秒执行一次任务,ThreadB
每隔30秒执行一次任务,ThreadC
每隔5分钟执行一次任务。
我没有使用忙碌的等待,并让线程在指定时间内休眠。
我的问题是干净关闭。我有一个变量,每个线程也具有读访问权限,因此他们可以看到用户何时启动程序的退出。下一次线程处于活动状态时,它们会退出循环并加入,一切都很好。但你可以看到ThreadC每5分钟才会唤醒一次。
我的问题是,我可以通知睡眠线程在睡眠时间结束之前唤醒并退出吗?如果无法做到这一点,我是否需要重新编写代码才能使用wait()
和notify()
,还是有更好的方法?
答案 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(),用于何时停止任务。