交出ScheduledThreadPoolExecutor
Hand over ScheduledThreadPoolExecutor
我在理解 ScheduledExecutorService/ScheduledThreadPoolExecutor 的具体工作原理时遇到了一些问题。我想要以下设置:
- 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();
}
}
- 一秒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' 版本相同。
我在理解 ScheduledExecutorService/ScheduledThreadPoolExecutor 的具体工作原理时遇到了一些问题。我想要以下设置:
- 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();
}
}
- 一秒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' 版本相同。