Java中的非fork-join执行器服务中是否有isQuiescent的等价物?
问题描述:
我已经在ForkJoin和FixedSizeThreadPool中做了两个我的问题的实现,我想比较它们的性能。在我的问题中,每个任务都会创建一些子任务,并将它们再次提交给执行者服务。在fork-join实现中,我使用fork(),而在另一个中,我使用execute()。Java中的非fork-join执行器服务中是否有isQuiescent的等价物?
显然,我的主线程需要等到整个工作完成。在fork-join中,我可以优雅地检查isQuiescent()属性以确保一切都已完成,但在另一种情况下,我想不出任何比手动计算已创建多少任务以及完成多少任务更好的事情!这个解决方案有效,但是以共享变量为代价,这明显降低了我的性能。
我不能只使用shutdown(),因为那么子任务将不会被调度(他们将得到RejectedExecutionException)。
有没有人知道比计算任务更好的解决方案?
答
实际上,关机会一直等到所有先前提交的任务完成。你的使用案例请看ExecutorCompletionService
。
感谢您的回答,但我没有立即看到这可以如何解决我的问题。我应该继续在循环中调用take(),直到它返回null或类似的东西? – Mahdi
确切地说:)你可以调用invokeAll并调用Future.get(),但是我发现take()更好,尤其是当你正在研究基准测试时。这样你也可以获得单个任务的统计信息。 –
那么,Future.get()显然不起作用,因为每个任务都在其子任务之前完成!我会尝试看看take()是否工作......再次感谢您的回答... – Mahdi