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

时间:2011-06-14 16:37:07

标签: java multithreading threadpool callable futuretask

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

我希望Executer一个Runnable。执行者将其包裹在FutureTask中并将其交还给我。现在我调用done()方法调查。但是,当done()方法返回true时,我希望收到通知。

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

我可以向我的执行者多加一些Callable以获得有关完成任务的通知吗?

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

4 个答案:

答案 0 :(得分:5)

答案 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那么优雅,但它可能是一个适当的解决方案,前提是您只需要一种类型的“侦听器”用于给定的执行器实例。