Как узнать, завершен ли поток / задача, запущенный Executor.execute() (не ExecutorService)?

#java #multithreading

#java #многопоточность

Вопрос:

В Java класс Executor не имеет shutdownNow() / awaitTermination, подобного подклассу ExecutorService. Итак, если вы запускаете задачу / поток, вызывая executorObject.execute(runnableTask), как вы можете проверить, завершена ли эта задача?

Комментарии:

1. Если у вас есть контроль над кодом Runnable, вы можете поместить что-нибудь в конец его run метода. В противном случае, если исполнитель не является ExecutorService, нет способа узнать, когда была запущена задача.

Ответ №1:

Вы не можете сделать это с помощью Executor просто потому, что он предоставляет единственный метод void execute(Runnable) . Если вы не рассматриваете возможность использования Executor реализаций, которые возвращают Future , вы можете реализовать собственный механизм уведомления / ожидания:

 final CountDownLatch latch = new CountDownLatch(1);
Runnable task = () -> {
   try {
      // ... do useful work
   } finally {
      latch.countDown();
   }
}

executorObject.execute(task);

// wrap into try/catch for InterruptedException
// if not propagating further
latch.await(); // await(timeout);