gpt4 book ai didi

java - 为什么没有 "awaitTermination(Date deadline)"方法?

转载 作者:行者123 更新时间:2023-12-04 06:16:32 24 4
gpt4 key购买 nike

我有一个提交给 ExecutorService 的任务列表。 .但是我需要在凌晨 2:30 的最后期限之前关闭 ExecutorService,即使任务没有完成。我怎样才能做到这一点?我检查了API,只有一个方法如下:

ExecutorService exec = //...    
exec.awaitTermination(100, TimeUnit.MILLISECONDS);

但是我怎样才能使下面的 block 原子地执行呢?也就是说,我怎样才能避免差距?例如:
long timeDiff= calculate(now, deadline);
// Gap: assuming current thread does not have chance to run for 10 minutes...
exec.awaitTermination(timeDiff, TimeUnit.MILLISECONDS);

谢谢。

最佳答案

您可能不是指“原子地”,我认为您的意思是“毫不拖延”。这样timeDiff调用 exec.awaitTermination() 时仍然正确.

我认为这是正确的,所以答案是:你不能。

如果您对详细信息感兴趣:
您的 Java 代码被翻译成 Java 字节码,这些由 JVM 执行,JVM 是在您的操作系统上运行的常规进程。而且您根本无法阻止操作系统中断线程(我假设您使用具有抢先式多任务处理的操作系统(每个 UNIX(包括 Linux 和 Mac OS X)、Windows 95 或更高版本……))。

即使您可以在一个 Java 字节码中完成所有这些操作,它仍然无法按照您的意愿工作,因为操作系统可能会在一个 Java 字节码的中间打断您。

甚至是 awaitTermination(Date deadline)方法在这里无济于事。它也必须由某人实现。

你能做的最好的事情就是用尽可能少的字节码来做。

如果我是你,我可能会像你的代码那样做。

但是,这可能更精确一点:

Date deadline = ....;

final TimerTask stopTask = new TimerTask() {
public void run() {
exec.shutdownNow();
}
};

new Timer().schedule(stopTask, deadline);

但正如我所说:没有真正的保证 shotdownNow()立即在 deadline 处执行.实际上,设置 deadline到实际截止日期前一秒应该没问题:-)

关于java - 为什么没有 "awaitTermination(Date deadline)"方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7164337/

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