Итак, я попробовал 3 разных варианта отложенных исполнителей для void/runnable/timertask, которые я хочу запустить через 5 секунд, но все коды, которые я использовал, не работали. Они немедленно запускают код.
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();
и с теми, для которых я использовал выполняемую задачу следующим образом: public Runnable clearstage() {//code} Я также попробовал timertask:
reviveplayerover = clearstage();
Timer timer = new Timer();
timer.scheduleAtFixedRate(reviveplayerover, 5000);
reviveplayer(namee, name);
timer.cancel();
и затем использовал: public TimerTask clearstage(){//code}
Вам нужно убедиться, что ваш метод main() не выходит до выполнения запланированной задачи.
// 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...
}
};
}
В вашем втором примере с использованием ScheduledExecutorService
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()
clearstage()
. Возвращает ли онRunnable
, содержащий ту работу, которую вы хотите, чтобы она выполняла внутри методаrun()
, или он выполняет ту работу, которую вы хотите, внутриclearstage()
?