如何等待计划任务的第一次迭代完成?

时间:2016-07-19 19:17:11

标签: java multithreading scheduledexecutorservice

我安排了一项经常性的任务。现在我希望主线程等待ScheduledExecutorService完成第一次执行。我怎么能做到这一点?

public void test1(){
  refreshFunction(); /* This should block until task has executed once. */
  /* Continue with main thread. */
  ... 
}

public void refreshFunction() {
  try {
    scheduledExecutorService = Executors.newScheduledThreadPool(1);
    scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
      @Override
      public void run() {
        loadInfo();
      }
    }, 1, 5, TimeUnit.MINUTES);
    logger.info(" : Completed refreshing information : "
      + new Timestamp(System.currentTimeMillis()));
  } catch (Exception ex) {
    ex.printStackTrace();
  }
}

1 个答案:

答案 0 :(得分:2)

使用CountDownLatch来协调线程。

final CountDownLatch latch = new CountDownLatch(1);
scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
  @Override
  public void run() {
    loadInfo();
    latch.countDown();
  }
}, 1, 5, TimeUnit.MINUTES);
latch.await();

更好的方法可能是计划任务在加载信息后执行回调以更新依赖于该信息的观察者。