ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
if(executor.isShutdown()) {
executor.scheduleAtFixedRate(helloRunnable, 0, 1, TimeUnit.SECONDS);
}
这段代码在每次事件发生时执行,我如何使它只在第一次执行?(例如,如果调度程序是starter,则不执行)
我尝试使用executor.isShutdown()
,但它不工作
- 您可以使用
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);
}
}
- 或者您可以使用
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
也会导致阻塞,但一旦调度器初始化,将没有阻塞