来自java文档,
ForkJoinPool 与其他类型的 ExecutorService 的不同之处主要在于采用工作窃取:池中的所有线程都尝试查找并执行其他活动任务创建的子任务(如果不存在,则最终阻塞等待工作)。
当大多数任务产生其他子任务时(大多数 ForkJoinTask 也是如此),这可以实现高效处理。在构造函数中将 asyncMode 设置为 true 时,ForkJoinPools 也可能适合与从未加入的事件样式任务一起使用。
经过下面的操作后ForkJoinPool 示例,与ThreadPoolExecutor不同,我没有看到设置Queue size的参数。我不知道 ForkJoinPool 是如何窃取机制的。
//creating the ThreadPoolExecutor
ThreadPoolExecutor executorPool = new ThreadPoolExecutor(2, 10, 60, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(3000), threadFactory, rejectionHandler);
假设我创建了10个线程的ThreadPoolExecutor,并提交了3000个Callable任务。这些线程如何分担子任务的执行负载?
对于相同的用例,ForkJoin 池的行为有何不同?
如果您预先有 3000 个任务,并且它们不会生成其他任务,则两者的行为不会有太大不同:使用 10 个线程,将一次运行 10 个任务,直到它们全部完成。
ForkJoinPool 专为以下情况而设计:您需要开始一个或几个任务,但这些任务知道如何将自己拆分为子任务。在这种情况下,ForkJoinPool 经过优化,允许任务检查处理线程的可用性并适当地分割自身。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)