阻止EDT直到executorservice完成所有任务

时间:2012-09-17 13:26:03

标签: java multithreading ui-thread

在我的应用程序中,我有两个jtextpanes,我有一个executorservice instacne,其中包含很少的任务。我想确保在执行任何jtextpanes的FocusListener focusGained方法之前,executorservice实例中的所有任务都已完成。另外,当调用focusLost方法时,我还会向executorservice添加更多任务。

代码

top.addFocusListener(new FocusListener()
{

  public void focusLost(FocusEvent e)
  {

    if (ecaViewControl.isInitialized())
    {
      stopRecording();
      executor.execute(new Runnable()
      {

        public void run()
        {
          ecaViewControl.save(top);

        }
      });

      executor.execute(new Runnable()
      {
        public void run()
        {
          ecaViewControl.closeDocument();

        }
      });

   }

  }

   public void focusGained(FocusEvent e)
   {
   //Need to have completed all the task in executor service before EDT executes the code in here

   });

}

1 个答案:

答案 0 :(得分:1)

如果您确实知道要完成的任务数量,请考虑使用CountDownLatch

因此您的代码可能如下所示:

public void run() {
    try {
    // do something here
    } finally {
       latch.countDown()
    }
}

然后在代码中等待任务完成 - 只需等待latch:

latch.await();

或者,如果您没有遗嘱执行人,可以使用CompletionService