好的,所以我尝试了3个不同的延迟执行器选项,用于我想在5秒后运行的void / runnable / timertask,但我使用的所有代码都不起作用。他们会立即运行代码。
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(clearstage(), 10, 10, SECONDS);
executor.shutdown();
我试过的第二个代码:
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
executor.scheduleWithFixedDelay(clearstage(), 0, 5, TimeUnit.SECONDS);
executor.shutdown();
和那些我使用过像这样的runnable任务:public Runnable clearstage(){// code} 我也尝试了时间任务:
reviveplayerover = clearstage();
Timer timer = new Timer();
timer.scheduleAtFixedRate(reviveplayerover, 5000);
reviveplayer(namee, name);
timer.cancel();
然后使用:public TimerTask clearstage(){//code}
答案 0 :(得分:0)
executor.scheduleWithFixedDelay(clearstage(), 0, 5, TimeUnit.SECONDS);
第二个参数是initialDelay
。这是Javadoc
ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
long initialDelay,
long delay,
TimeUnit unit)
...
initialDelay - the time to delay first execution
您正在传递0
,因此第一个预定的Runnable
不会延迟。 ExecutorService.shutdown()
运行已安排的所有任务,然后关闭。由于您之后也会立即调用shutdown()
,因此不会安排任务,也不会执行任务。
使用ScheduledExecutorService
时的另一个选择是使用public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit);
方法安排延迟任务。由于它是在调用shutdown()
之前安排的,因此它将始终完成。
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
scheduledFuture = executor.schedule(clearstage(), 5, TimeUnit.SECONDS);
executor.shutdown();
您还可以等待预定的未来完成。从问题中不清楚你正在寻找什么。
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
ScheduledFuture<?> scheduledFuture = executor.schedule(clearstage(), 5, TimeUnit.SECONDS);
scheduledFuture.get(); // Wait for completion
executor.shutdown()
答案 1 :(得分:0)
你需要确保你的主要()&#39;方法在计划任务执行之前不会退出。
// Example with a one-shot delay
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
executor.schedule(clearstage(), 5, TimeUnit.SECONDS);
executor.shutdown();
executor.awaitTermination(6, TimeUnit.SECONDS);
System.out.println("Done.");
// And your clearstage() must be implemented like this:
private static Runnable clearstage() {
return new Runnable() {
@Override
public void run() {
// Code goes here...
}
};
}