交出ScheduledThreadPoolExecutor

Hand over ScheduledThreadPoolExecutor

我在理解 ScheduledExecutorService/ScheduledThreadPoolExecutor 的具体工作原理时遇到了一些问题。我想要以下设置:

  1. A class 设置 ScheduledThreadPoolExecutor,在安排任务之前将 RemoveOnCancelPolicy 设置为 true 并关闭 ScheduledThreadPoolExecutor(因为我想在 try-catch-block 中调用 produce 函数)。任务的处理应该在第二个class中完成,这就是为什么我想交出ScheduledThreadPoolExecutor。
public class SetupExecutorService implements AutoCloseable {
    
    private final ScheduledThreadPoolExecutor executorService;
    private final Producer producer;

    public SetupExecutorService(Producer producer) {
        executorService = new ScheduledThreadPoolExecutor(1);
        this.producer = producer;
    }

    public void produce() {
        executorService.setRemoveOnCancelPolicy(true);
        producer.schedule(executorService);
    }
    
    @Override
    public void close() throws Exception {
        executorService.shutdown();
    }

}
  1. 一秒class,实际处理定时执行的任务:
public class Producer implements Runnable {

    public Producer(int pauseInMilliSec) {
        this.pauseInMilliSec = pauseInMilliSec;
    }

    @Override
    public void run() {
        System.out.println("calling run");
        ...
    }

    public void schedule(ScheduledExecutorService executorService) {
         executorService.scheduleAtFixedRate(this, 0, pauseInMilliSec, TimeUnit.MILLISECONDS);
    }

}

很遗憾,此设置不起作用。我不确定哪里出错了,但是,如果我只是将 executorService 拉入 Producer class,一切都会按预期工作并且任务会定期执行:

public class Producer implements Runnable {

    public Producer(int pauseInMilliSec) {
        this.pauseInMilliSec = pauseInMilliSec;
    }

    @Override
    public void run() {
        System.out.println("calling run");
        ...
    }

    public void schedule() {
         ScheduledThreadPoolExecutor executorService = new ScheduledThreadPoolExecutor(1);
         executorService.setRemoveOnCancelPolicy(true);
         executorService.scheduleAtFixedRate(this, 0, pauseInMilliSec, TimeUnit.MILLISECONDS);
    }

}

有人可以指出错误吗?

非常感谢您的帮助:)

当您 shutdown 执行器时,它将不再接受任何任务,只会耗尽当前待处理任务队列。在 ScheduledExecutor 的情况下,所有未来的计划任务都将被取消并且不会触发。

换句话说,您在第一个计划任务 运行 有效取消它之前关闭执行器。在你的第二种情况下,你没有关闭执行程序 - 因此它起作用了。

如果您在 'broken' 设置中删除 shutdown,它的行为方式将与您的 'fixed' 版本相同。