我有一个用于计算持续时间的线程执行程序:
private ScheduledExecutorService updateTime = Executors.newSingleThreadScheduledExecutor();
它是基于布尔属性执行的,如果用户按下按钮,该布尔属性只会被更改一次:
gameStarted.addListener((e) -> {updateTime.scheduleAtFixedRate(this::calculateDuration, 1, 1, TimeUnit.SECONDS);});
但它的速度是应该的两倍,实际上当我向System.out.println(Thread.currentThread().getName());
方法添加calculateDuration
时,我看到同一个线程(pool-2-thread-1
)每次都有两次。
更奇怪的是,如果我删除监听器并启动执行程序,如下:
updateTime.scheduleAtFixedRate(this::calculateDuration, 1, 1, TimeUnit.SECONDS);
然后它以正确的速率运行,线程每次进入方法一次,但我必须使用触发器来启动执行程序,因为它不应该在游戏开始之前运行。
执行者跑两倍的原因是什么原因?