Java Callable FutureTask Excecuter: Как слушать готовое задание
-
27-10-2019 - |
Вопрос
Я новичок в службах исполнителя. Мне нравилось делать все сам, но я думаю, что пришло время доверять этим услугам.
Я хочу передать 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
это возвращается ListenableFuture
S ИСПОЛЬЗОВАНИЕ Methexecutors.listeningDecorator (Executorservice). Анкет Вы также можете в настоящее время обернуть свой Runnable
с/Callable
S в Прослушиваемаяфутуретаска самим собой.
final ListenableFutureTask<?> task = new ListenableFutureTask<Object>(
runnable, null);
executor.submit(task);
task.addListener(new Runnable() {
public void run() {
// do whatever
}
}, listenerExecutor);