java可调用的FutureTask Excecuter:如何侦听已完成的任务

java可调用的FutureTask Excecuter:如何侦听已完成的任务,java,multithreading,threadpool,callable,futuretask,Java,Multithreading,Threadpool,Callable,Futuretask,我对executer服务很陌生。我喜欢自己做每件事,但我认为是时候信任这些服务了 我想通过ExecuteraRunnable来实现。执行者将其包装在未来任务中并将其交还给我。现在我调用polldone()方法。但我希望在done()方法返回true时得到通知 有一个get()方法,在Runnable完成之前一直阻塞,但是我需要为每个作业增加一个线程,以便查看它何时完成 我可以给我的执行者一些额外的Callable来获得任务完成的通知吗 这里怎么走?我可以在run方法的末尾添加一些代码,但是don

我对executer服务很陌生。我喜欢自己做每件事,但我认为是时候信任这些服务了

我想通过
Executer
a
Runnable
来实现。执行者将其包装在
未来任务中
并将其交还给我。现在我调用poll
done()
方法。但我希望在
done()
方法返回true时得到通知

有一个
get()
方法,在
Runnable
完成之前一直阻塞,但是我需要为每个作业增加一个线程,以便查看它何时完成

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


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

如果您想一个接一个地执行任务,最好在同一个线程中执行

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

这样,在同一线程中运行后,它将执行您想执行的任何操作,而您不需要轮询或使用其他线程。

ExecutorCompletionService


我建议查看中的软件包,特别是与之相关的类型和代码

一旦下一个版本(r10)发布,就可以很容易地创建一个
ExecutorService
,它使用返回
ListenableFuture
s。您当前还可以将
Runnable
s/
Callable
s包装在一个文件中

final ListenableFutureTask<?> task = new ListenableFutureTask<Object>(
    runnable, null);
executor.submit(task);
task.addListener(new Runnable() {
  public void run() {
    // do whatever
  }
}, listenerExecutor);
最终ListenableFutureTask任务=新建ListenableFutureTask(
可运行,空);
执行人提交(任务);
task.addListener(新的Runnable(){
公开募捐{
//做任何事
}
}(执行人);

如果您可以具体假设使用java.util.concurrent.ThreadPoolExecutor,那么您可以使用它的钩子方法;afterExecute()和BeforExecute()


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

这不是Peter Lawrey的方法中的一种复杂方式吗?也许有了这个装饰器,它可以是整洁的代码。第10节什么时候来?有什么beta版可以下载吗?@unreputable:在Peter的方法中,任务完成后要做什么的处理被集中在提交给执行者的任务中。例如,如果任务被取消,你就不会发现。如前所述,委托的
run()
中的异常也会导致零件无法运行。另外,您将之后发生的事情与任务本身绑定到同一个线程,这可能是您不想要的。您的框架是否可以防止错误,例如OutOfMemoryError?所以我可以肯定注册的听众总是会被叫来的?@Franz:我似乎记得听说r10的7月份,但没有正式的日期。当然,您可以构建最新的源代码,实际上扩展
AbstractExecutorService
(在1.6中)来制作监听装饰器非常容易。我还有多线程问题。我不知道我应该如何在我未来的任务中使用“取消”,所以我想与您核实一下。如果可能的话,你能在那边帮我吗。