9

我对执行服务很陌生。喜欢自己做所有事情,但我认为是时候相信这些服务了。

我想Executer通过Runnable. 刽子手FutureTask把它包起来递给我。现在我调用 polldone()方法。但是我希望在 thendone()方法返回 true 时收到通知。

有一种get()方法会阻塞直到Runnable完成,但是我需要为每个作业添加一个额外的线程,以查看它何时完成。

我可以给我的执行者一些额外的东西Callable来获得关于任务完成的通知吗?

去这里的路是什么?我可以在方法的末尾添加一些代码run,但done()可能仍然是错误的......

4

4 回答 4

5

ExecutorCompletionService

http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ExecutorCompletionService.html

于 2011-06-14T16:42:53.363 回答
3

我建议查看Guava中的com.google.common.util.concurrent包,特别是ListenableFuture类型和与之相关的代码。

下一个版本 (r10) 发布后,使用MoreExecutors.listeningDecorator(ExecutorService)ExecutorService创建一个返回ListenableFutures 的函数将很容易。您目前还可以自己将您的 ​​s/ s 包装在ListenableFutureTask中。RunnableCallable

final ListenableFutureTask<?> task = new ListenableFutureTask<Object>(
    runnable, null);
executor.submit(task);
task.addListener(new Runnable() {
  public void run() {
    // do whatever
  }
}, listenerExecutor);
于 2011-06-14T16:45:23.930 回答
3

如果你想一个接一个地完成一项任务,最好在同一个线程中完成。

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

这样,它会在同一个线程中的可运行之后做任何你想做的事情,你不需要轮询或使用另一个线程。

于 2011-06-14T16:41:40.273 回答
1

如果您可以做出使用 java.util.concurrent.ThreadPoolExecutor 的特定假设,那么您可以使用它的钩子方法;afterExecute() 和 beforeExecute()。

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

它们不如 ListenableFuture 优雅,但它可能是一个足够的解决方案,前提是您只需要给定执行程序实例的一种“侦听器”。

于 2011-06-14T19:42:16.697 回答