gpt4 book ai didi

java - 正确编写 ExecutorService.shutdownNow() 可以停止的任务?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:56:29 34 4
gpt4 key购买 nike

我有一个表单的处理循环

while (true) {
doWork();
Thread.sleep(SLEEP_INTERVAL);
}

我想用它制作一个 Runnable,它可以很好地与 ExecutorService 配合使用,并且会在调用 ExecutorService.shutdownNow() 时退出。

我想这样写:

public WorkerTask implements Runnable
{
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
doWork();
try {
Thread.sleep(SLEEP_INTERVAL);
}
catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}

简单的测试表明它至少看起来是有效的,因为任务被中断并退出,ExecutorService 将关闭,并且无论中断是在 doWork() 正在处理时还是在 sleep 期间到达,似乎都是如此。 (通过改变 doWork() 的工作量和 SLEEP_INTERVAL 的大小,我几乎可以控制中断发生的位置)。

但是当我用谷歌搜索时,我看到了使用 Thread.interrupted()Thread.currentThread().isInterrupted() 的示例。我知道前者清除中断标志而后者离开它,但我还需要关心其他区别吗?

我还看到 Thread.currentThread().isInterrupted()Thread.interrupted() 的结果存储在 volatile 变量中并且该变量用作 while 循环测试条件的版本。那只是一种风格还是有必要这样做?在我所写的内容中,我是否不得不担心在设置中断标志(无论是在线程处于 Activity 状态时被接收,还是通过我捕获 InterruptedException 并重新声明标志)和调用 Thread.currentThread().isInterrupted() 之间,某些东西会以某种方式清除中断标志在循环测试中?

最佳答案

我觉得你的代码没问题。引入一个额外的 volatile 变量会带来不必要的复杂性:中断状态可以完成这项工作。

Java 并发实践中,处理任务中断的推荐方法是抛出 InterruptedException(如果任务是 Callable 而不是 Runnable),或者确保设置了中断状态并尽快退出任务。你的代码做得很好。

关于java - 正确编写 ExecutorService.shutdownNow() 可以停止的任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11698021/

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