我已经通过在每个计划的执行中启动嵌套的匿名runnable来解决了这个问题:
final ScheduledExecutorService service = Executors.newScheduledThreadPool(POOL_SIZE);
final Runnable command = new SlowRunnable();
service.scheduleAtFixedRate(
new Runnable() {
@Override
public void run() {
service.execute(command);
}
},1,TimeUnit.SECONDS);
在这个例子中,将有一个线程在每个间隔执行一个快速指令,所以当下一个间隔到期时它肯定会完成.剩下的POOL_SIZE-1线程将并行执行SlowRunnable的run(),这可能比单个时间间隔的持续时间更长.
请注意,虽然我喜欢这个解决方案,因为它最小化代码并重用相同的ScheduledExecutorService,但它必须正确调整大小并且可能无法在每个上下文中使用:如果SlowRunnable非常慢以至于POOL_SIZE作业一起执行,那么没有线程可以及时运行计划任务.
此外,如果您将间隔设置为1 TimeUnit.NANOSECONDS,那么主runnable的执行可能会变得太慢.