Задержка исполнителя Java не работает

1

Итак, я попробовал 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}

  • 0
    Добавьте, что делает ваш clearstage() . Возвращает ли он Runnable , содержащий ту работу, которую вы хотите, чтобы она выполняла внутри метода run() , или он выполняет ту работу, которую вы хотите, внутри clearstage() ?
  • 0
    это функция, которая не возвращает ничего, что она выполняет только внутри функции.
Показать ещё 1 комментарий
Теги:
timer
runnable
delay
executor

2 ответа

0
Лучший ответ

Вам нужно убедиться, что ваш метод 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...
        }
      };
    }
  • 0
    это не проблема, я не хочу, чтобы он выполнялся несколько раз только с задержкой. если это не сработало бы так, оно бы даже не запустилось немедленно.
  • 0
    Обновил мой ответ ...
Показать ещё 3 комментария
0

В вашем втором примере с использованием 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()
  • 1
    по-прежнему выполняется немедленно.
  • 0
    @jeroen Я обновил свой ответ, но до сих пор неясно, что вы спрашиваете.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню