java - 如何根据条件关闭 Java ScheduledExecutorService?

标签 java executorservice scheduledexecutorservice

我遇到了一种停止 Java ScheduledExecutorService 的方法,该服务在 this 的时间限制后运行定期后台任务。论坛讨论。

就我而言,当某个条件成立时,我需要停止 ScheduledExecutorService。例如,一旦计数超过 5,我想停止打印“beep {count}”。为此,我使用了之前突出显示的示例。

public class BeeperControl {
    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

    private int count;

    public void beep() {
        final Runnable beeper = new Runnable() {
            public void run() {
                count = count + 1;
                System.out.println("beep " + count);

                if (count == 5) {
                    scheduler.shutdown();
                }
            }
        };
        final ScheduledFuture<?> beeperHandle = scheduler.scheduleAtFixedRate(
                beeper, 1, 1, SECONDS);
    }

    public static void main(String[] args) {
        BeeperControl bc = new BeeperControl();
        bc.beep();
    }
}

在这里,我检查了计数是否等于 5,然后使用 scheduler.shutdown() 方法关闭 ScheduledExecutorService。

我的问题是,对于给定的场景(因为 ScheduledExecutorService 被正在运行的任务关闭)这是否是一个好的做法,或者是否有更好的替代方案可以在这种场景中使用?

最佳答案

不建议在多线程环境中使用可变状态(count 变量),因为它可能会导致 count 变量中的值作为读-增量-写(count = count + 1) 正在发生。

如果您使用 AtomicInteger 而不是普通的旧 int 作为 count 变量,那就太好了。

public class BeeperControl {
    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

    private final AtomicInteger count = new AtomicInteger(0);

    public void beep() {
        final Runnable beeper = new Runnable() {
            public void run() {
                count.getAndIncrement();
                System.out.println("beep " + count);

                if (count.get() == 5) {
                    scheduler.shutdown();
                }
            }
        };
        final ScheduledFuture<?> beeperHandle = scheduler.scheduleAtFixedRate(
                beeper, 1, 1, SECONDS);
    }

    public static void main(String[] args) {
        BeeperControl bc = new BeeperControl();
        bc.beep();
    }
}

通过正在运行的任务关闭 ScheduledExecutorService 是可以的,因为在许多情况下都会发生这种情况。

关于java - 如何根据条件关闭 Java ScheduledExecutorService?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46766992/

相关文章:

java - 循环检查字符串数组中的项目

java - 使用jar uf更新jar后出错

java - 读取 Grib2 文件中的纬度/经度数据

java - ExecutorService(特别是 ThreadPoolExecutor)线程安全吗?

java - 线程中的异常 "main"java.lang.ClassCastException : cannot be cast to java. util.concurrent.Callable

java - 避免调度执行器创建 java 进程的多个实例

Java - 多线程 Raytracer 循环

java - 使用 ScheduledExecutorService 方法定期运行一批任务

Java ScheduledExecutorService 错误精度

java - Executor ScheduledThreadPool "more"线程池有什么作用?