我有一个方法需要每n秒调用一次。在Java的旧时代,我会做这样的事情:
Runnable task = () -> {
while (!updater.isInterrupted()) {
//some Task
} catch (InterruptedException e) {}
}
};
Thread updater = new Thread(task);
updater.start();
}
但这显然是一个坏主意。如果我想要停止Thread,我需要调用updater.interrupt()并依赖异常处理,这实际上并不是针对这些东西做的。
所以我猜有一些奇特的“新”Java8方式。我已经看到了这个:
public class TestSchedularService {
long sleep = 500;
@Test
public void testLoop2() throws Exception {
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
ScheduledFuture future = executor.scheduleWithFixedDelay(new PollingService(), 0, sleep,TimeUnit.MILLISECONDS);
Thread.sleep(2 * sleep);
future.cancel(false);
executor.shutdown();
}
}
class PollingService implements Runnable {
private int count = 0;
public void run() {
System.out.println("iteration :" + (count++));
}
}
但似乎它正在每次调用时创建一个PollingService实例,这看起来很糟糕。那么每n秒调用一个方法最有效和“最新”的方法是什么?
答案 0 :(得分:3)
使用ScheduledExecutorService
是正确的方法。它不创建PollingService
的新实例,您创建它并且执行程序始终在同一实例上调用run
,直到您取消Future
。