如何只执行调度程序,如果它没有启动?


ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
if(executor.isShutdown()) {
executor.scheduleAtFixedRate(helloRunnable, 0, 1, TimeUnit.SECONDS);
}

这段代码在每次事件发生时执行,我如何使它只在第一次执行?(例如,如果调度程序是starter,则不执行)

我尝试使用executor.isShutdown(),但它不工作

  1. 您可以使用AtomicBoolean来管理对执行器的访问:
private final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
private static final AtomicBoolean IS_ACTIVE = new AtomicBoolean(false);
private void startScheduler() {
if (IS_ACTIVE.compareAndSet(false, true)) {
executor.scheduleAtFixedRate(() -> {}, 0L, 5L, TimeUnit.SECONDS);
}
}
  1. 或者您可以使用synchronized和延迟初始化使其工作:
private volatile ScheduledExecutorService scheduler;
public void startScheduler() {
if (scheduler == null) {
this.initAndStart();
}
}
private synchronized void initAndStart() {
if (scheduler == null) {
scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.schedule(() -> log.info("Started, Thread: {}", Thread.currentThread().getName()), 0L, TimeUnit.SECONDS);
}
}

注意:它将尝试阻塞当前的类和线程,设法调用initAndStart也会导致阻塞,但一旦调度器初始化,将没有阻塞

相关内容