java Callable FutureTask Excecuter:如何监听已完成的任务
我对执行者服务很陌生。 喜欢自己做所有事情,但我认为是时候相信这些服务了。
我想通过Executer
将Runnable
交给我。 执行者将它包装在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那样优雅,但它可能是一个适当的解决方案,前提是您只需要一种类型的“侦听器”来执行给定的执行器实例。
ExecutorCompletionService
http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ExecutorCompletionService.html
如果你想一个接一个地做一个任务,最好在同一个线程中做。
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