我有一个我想要运行的任务,延迟将不断变化(即 - 没有固定的间隔)。
我想要一个线程并无限循环找到延迟值,将其输入到执行程序中,然后一旦完成该任务,找到新的延迟值等。
我目前的“基本”实施:
long targetTime = findNextTime()/1000;
long currentTime = System.curentTimeMillis()/1000;
delay = targetTime - currentTime;
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(3);
Runnable task = new Runnable() {
public void run() {
System.out.println("Test Task");
ScheduledFuture<?> future = scheduler.schedule(this, delay, TimeUnit.SECONDS);
}
}
我怎样才能找到新的延迟并继续重复这个任务?
我应该轮询future
完成然后做一个递归循环吗?我试试这个,我得到一个错误。
有一些答案可以解决这个问题.Reinitialize fix delay in ScheduledExecutorService和How to change Spring's @Scheduled fixedDelay at runtime
在这里,我支持另一种方法来实现这个重复提交任务到ExecutorService
class Task implements Runnable {
private static Random random = new Random();
private ExecutorService executor;
public Task(ExecutorService executor) {
this.executor = executor;
}
@Override
public void run() {
try {
System.out.println(System.currentTimeMillis() + " Hello World");
TimeUnit.MILLISECONDS.sleep(random.nextInt() % 100);
executor.execute(this);
} catch (Exception e) {
}
}
}