java执行器延迟不起作用

时间:2014-12-23 21:16:23

标签: java timer delay runnable executor

好的,所以我尝试了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}

2 个答案:

答案 0 :(得分: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)

你需要确保你的主要()&#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...
        }
      };
    }