gpt4 book ai didi

java - 为什么 ScheduledExecutorService 无法从 Runnable 命令本身关闭?

转载 作者:行者123 更新时间:2023-11-30 02:55:57 24 4
gpt4 key购买 nike

我想安排一个命令每 1 秒执行一次。该命令将增加一个计数器,当计数器达到一定限制时,执行将停止,ExecutorService 将关闭。所以我写了以下代码片段:

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

public class SchedulerTest {

private ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
private ScheduledFuture<?> scheduledTask;

private AtomicInteger counter = new AtomicInteger(0);

public SchedulerTest() {

}

private void check() {
Runnable task = new Runnable() {

@Override
public void run() {
int currentValue = counter.incrementAndGet();
System.out.println(currentValue);

if(currentValue == 5) {
scheduledTask.cancel(false);

scheduler.shutdown();
while(!scheduler.isTerminated()) {}
}
}
};

scheduledTask = scheduler.scheduleAtFixedRate(task, 0, 1, TimeUnit.SECONDS);
}

public static void main(String[] args) {
new SchedulerTest().check();
}
}

以上代码仅用于演示目的。

现在我可以在 Eclipse 控制台中看到以下内容:

console image

右上角的红色按钮,表明 ExecutorService 正在运行时 JVM 仍在运行。我已将日志放入 while 中,并且我看到循环永远不会终止。

我想知道这种行为背后的原因是什么?有什么方法可以从 Runnable 命令本身终止 ExecutorService 吗?

我使用的是JDK6。

最佳答案

在 run 方法中检查线程池的终止状态:

while(!scheduler.isTerminated()) {}

这将执行以下操作:

  • 执行该可运行的线程将进入循环。
  • 由于线程仍处于“Activity ”状态,即尚未完成运行,因此条件将为 true(“未终止 = true”)。
  • 这将使线程永远保持在循环中

因此删除该“while”,线程池将按预期终止。

P.S.:如果你想在主执行线上等待池被终止,你可以使用 awaitTermination .

关于java - 为什么 ScheduledExecutorService 无法从 Runnable 命令本身关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37203916/

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