gpt4 book ai didi

java - 为什么要在取消定时器任务之前让主线程 hibernate ?

转载 作者:行者123 更新时间:2023-11-30 07:52:11 25 4
gpt4 key购买 nike

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 将永远不会退出。

编辑

我刚刚意识到 TimerTasknot a lambda-compatible type ,因此方法引用在那里不起作用。

关于java - 为什么要在取消定时器任务之前让主线程 hibernate ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46207880/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com