繁体   English   中英

跟踪ExecutorService中的已完成任务

[英]Tracking Completed Tasks in ExecutorService

我正在用Java编写一个应用程序,它使用ExecutorService来运行多个线程。

我希望将多个任务(一次数千个)作为Callables提交给Executor,并在完成后检索其结果。 我接近这个的方式是每次调用submit()函数时,我得到一个存储在ArrayList中的Future。 稍后我将List传递给一个不断迭代它的线程,调用future.get()函数并超时以查看任务是否完成。 这是正确的方法还是效率太低?

编辑---更多信息---另一个问题是每个Callable需要不同的处理时间。 因此,如果我只是从List中取出第一个元素并在其上调用get(),它将阻塞,而其他元素的结果可能变得可用而程序将无法知道。 这就是为什么我需要继续迭代超时。

提前致谢

这是正确的方法还是效率太低?

这本身并不正确。 你不必要地迭代ArrayList检查任务完成。

这很简单:只需使用: CompletionService 您可以轻松地将现有执行程序包装到其中。 来自JavaDocs:

生产者提交执行任务。 消费者完成任务并按照他们完成的顺序处理结果。

实质上, CompletionService提供了一种简单地通过调用take()来获取结果的方法。 它是一个阻塞函数,调用者将阻塞,直到结果可用。


请注意,对Future.get的调用将阻止,直到答案可用。 所以你不需要另一个线程迭代数组列表。

请参阅https://blogs.oracle.com/CoreJavaTechTips/entry/get_netbeans_6

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM