- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在this example作者在取消定时器任务之前将运行定时器任务的主线程置于 sleep 状态,如下所示:
System.out.println("TimerTask started");
//cancel after sometime
try {
Thread.sleep(120000);
} catch (InterruptedException e) {
e.printStackTrace();
}
timer.cancel();
System.out.println("TimerTask cancelled");
try {
Thread.sleep(30000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
取消后作者又让它 hibernate 了30秒。只是好奇为什么这样做?这是否只是为了表明即使主线程正在 hibernate 计时器仍会运行,并且添加额外的 30 秒只是为了让计时器有机会取消自身?还有另一种方法可以告诉计时器在 120 秒后取消而不让主线程进入休眠状态吗?
很好的答案 - 只是一个后续问题,以确保我理解正确 - 如果线程不是守护进程,我们在 2 分钟后取消第一个任务,使用计时器安排另一个任务,就像你展示的那样,然后停止主线程线程(因为所有计划的任务现在都被取消了)?
最佳答案
代码是示范性的。 sleep 只是为了显示取消任务前后的差异。它等待两分钟以显示计时器每 10 秒执行一次工作,然后它取消任务并等待 30 秒,以便您可以看到它不再执行其工作。
Also is there another way to tell the timer to cancel after 120 seconds without putting the main thread to sleep?
一个选项是安排第二个计时器任务在 120 秒后运行,其可运行代码只是取消第一个任务。
Timer timer = new Timer(false);
TimerTask firstTask = new TimerTask() {
@Override
public void run() {
System.out.println("Hitme");
}
};
timer.scheduleAtFixedRate(firstTask, 5000, 5000);
timer.schedule(new TimerTask() {
@Override
public void run() {
firstTask.cancel();
}
},45000);
不过您需要小心,因为有时 Timer
和其他计划的执行程序运行为 daemon threads .如果您的 main 方法完成并且唯一剩下的线程是守护线程,则 JVM 将终止,无论是否有待处理的任务。
在这个例子中,作者将 true
传递给 Timer
的构造函数,这意味着它将作为守护进程。如果保持不变,并且 sleep 被删除,JVM 将立即退出,因为唯一剩下的线程将是守护进程计时器线程。使其成为非守护进程的另一面是,除非其他线程取消 Timer
,否则您的 JVM 将永远不会退出。
我刚刚意识到 TimerTask
是 not a lambda-compatible type ,因此方法引用在那里不起作用。
关于java - 为什么要在取消定时器任务之前让主线程 hibernate ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46207880/
有人可以向我澄清主线 DHT 规范中的声明吗? Upon inserting the first node into its routing table and when starting up th
我正在尝试使用 USB 小工具驱动程序使嵌入式设备作为 MTP 设备工作。 我知道 Android 从大容量存储设备切换到 MTP 设备已经有一段时间了,并且找到了 source code for M
我是一名优秀的程序员,十分优秀!