java Callable FutureTask Excecuter:如何监听已完成的任务

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

我想通过ExecuterRunnable交给我。 执行者将它包装在FutureTask并将其交还给我。 现在我调用poll done()方法。 但是我希望在done()方法返回true时得到通知。

有一个get()方法阻塞直到Runnable完成,但是我需要为每个作业添加一个额外的线程,只是为了看看它什么时候完成。

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

怎么去这里? 我可以在run方法的末尾添加一些代码,但是done()可能仍然是false …

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

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

它们不像ListenableFuture那样优雅,但它可能是一个适当的解决方案,前提是您只需要一种类型的“侦听器”来执行给定的执行器实例。

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

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

通过这种方式,它可以在同一个线程中的runnable之后执行您想要的任何操作,并且您不需要轮询或使用其他线程。

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

一旦下一个版本(r10)结束,就可以很容易地创建一个使用MoreExecutors.listeningDecorator(ExecutorService)返回ListenableFuture的ExecutorService 。 您现在还可以自己将Runnable s / Callable包装在ListenableFutureTask中 。

 final ListenableFutureTask task = new ListenableFutureTask( runnable, null); executor.submit(task); task.addListener(new Runnable() { public void run() { // do whatever } }, listenerExecutor);