微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决java Callable FutureTask Excecuter:如何收听完成的任务

|| 我对执行程序服务很陌生。我喜欢自己做所有事情,但我认为是时候信任这些服务了。 我想递
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);
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。