我对执行者服务很新。喜欢自己做所有事情,但我认为是时候相信这些服务了。
我希望Executer
一个Runnable
。执行者将其包裹在FutureTask
中并将其交还给我。现在我调用done()
方法调查。但是,当done()
方法返回true时,我希望收到通知。
有一个get()
方法阻塞直到Runnable
完成,但是我需要为每个作业添加一个额外的线程,只是为了看看它什么时候完成。
我可以向我的执行者多加一些Callable
以获得有关完成任务的通知吗?
这里有什么方法?我可以在run
方法的末尾添加一些代码,但是done()
可能仍然是假的......
答案 0 :(得分:5)
ExecutorCompletionService
http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ExecutorCompletionService.html
答案 1 :(得分:3)
如果你想一个又一个地完成一个任务,那么最好在同一个线程中完成它。
Executor executor =
final Runnable runnable =
executor.execute(new Runnable() {
public void run() {
runnable.run();
// do something after the run() has finished.
}
});
这样它可以在同一个线程中的runnable之后做你想做的任何事情,而你不需要轮询或使用另一个线程。
答案 2 :(得分:3)
我建议您查看com.google.common.util.concurrent中的Guava包,特别是ListenableFuture类型以及与之相关的代码。
下一个版本(r10)结束后,可以轻松创建使用MoreExecutors.listeningDecorator(ExecutorService)返回ExecutorService
的{{1}}。您现在还可以自己将ListenableFuture
s / Runnable
包裹在ListenableFutureTask中。
Callable
答案 3 :(得分:1)
如果您可以对使用java.util.concurrent.ThreadPoolExecutor做出具体假设,那么您可以使用其钩子方法; afterExecute()和beforeExecute()。
http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html
它们不如ListenableFuture那么优雅,但它可能是一个适当的解决方案,前提是您只需要一种类型的“侦听器”用于给定的执行器实例。