问题描述
||
我对执行程序服务很陌生。我喜欢自己做所有事情,但我认为是时候信任这些服务了。
我想递
Executer
和Runnable
。执行者将其包装成in2ѭ,然后递给我。现在,我将poll称为done()
方法。但是我想在done()
方法返回true时得到通知。
有一个get()
方法阻塞,直到Runnable
完成,但是然后我需要为每个作业分配一个额外的线程,以查看它何时完成。
我可以多给我的执行者ѭ7来通知任务完成吗?
去这里的路是什么?我可以在run
方法的末尾添加一些代码,但是then3ѭ可能仍然是错误的...
解决方法
如果可以对使用java.util.concurrent.ThreadPoolExecutor做出特定的假设,则可以使用其hook方法。 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.
}
});
这样,它将在同一线程中的可运行对象之后执行您想做的任何事情,并且您不需要轮询或使用另一个线程。
, 我建议您先看看Guava中的com.google.common.util.concurrent包,特别是ListenableFuture类型和与之相关的代码。
下一个版本(r10)发布后,使用MoreExecutors.listeningDecorator(ExecutorService)创建返回11的ѭ11很容易。您现在还可以自己将Runnable
/Callable
包装在ListenableFutureTask中。
final ListenableFutureTask<?> task = new ListenableFutureTask<Object>(
runnable,null);
executor.submit(task);
task.addListener(new Runnable() {
public void run() {
// do whatever
}
},listenerExecutor);