Вопрос

Я новичок в службах исполнителя. Мне нравилось делать все сам, но я думаю, что пришло время доверять этим услугам.

Я хочу передать Executer а Runnable. Анкет Исполнитель окуняет это в FutureTask и передает это мне. Теперь я называю опросом done() метод Но я хотел бы, чтобы меня уведомляли, когда тогда done() Метод вернет истин.

Eсть get() метод, который блокирует до Runnable закончил, но тогда мне понадобится дополнительная ветка для каждой работы, просто чтобы увидеть, когда она закончена.

Могу ли я передать своему исполнителю немного дополнительного Callable Чтобы получить уведомление о завершении задачи?

На что сюда пойти? Я мог бы добавить код в конце run метод, но затем done() все еще может быть ложным ...

Это было полезно?

Решение

Если вы можете сделать конкретное предположение об использовании java.util.concurrent.threadpoolexecutor, то вы можете использовать его методы крючка; Послеэкскутатный () и передэксек ().

http://download.oracle.com/javase/6/docs/api/java/util/concurrent/threadpoolexecutor.html

Они не так элегантны, как слушание, но это может быть адекватным решением, если вам нужен только один тип «слушателя» для данного экземпляра исполнителя.

Другие советы

Если вы хотите выполнить одну задачу за другой, лучше сделать это в том же потоке.

Executor executor =
final Runnable runnable = 
executor.execute(new Runnable() {
    public void run() {
         runnable.run();
         // do something after the run() has finished.
    }
 });

Таким образом, он будет делать все, что вы хотите сделать после запуска в том же потоке, и вам не нужно опросить или использовать другой поток.

Я бы посоветовал взглянуть на com.google.common.util.concurrent упаковка в Гуава, в частности Прослушиваемая номера Тип и код, связанный с ним.

Как только следующий выпуск (R10) выйдет, будет легко создать ExecutorService это возвращается ListenableFutureS ИСПОЛЬЗОВАНИЕ Methexecutors.listeningDecorator (Executorservice). Анкет Вы также можете в настоящее время обернуть свой Runnableс/CallableS в Прослушиваемаяфутуретаска самим собой.

final ListenableFutureTask<?> task = new ListenableFutureTask<Object>(
    runnable, null);
executor.submit(task);
task.addListener(new Runnable() {
  public void run() {
    // do whatever
  }
}, listenerExecutor);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top