从java文档,
ForkJoinPool 与其他类型的 ExecutorService 的不同之处主要在于采用了工作窃取:池中的所有线程都尝试查找并执行由其他活动任务创建的子任务(如果不存在,则最终阻塞等待工作)。
当大多数任务产生其他子任务(大多数 ForkJoinTasks 也是如此)时,这可以实现高效处理。在构造函数中将 asyncMode 设置为 true 时,ForkJoinPools 也可能适用于从未加入的事件样式任务。
经过下面的ForkJoinPool 示例后,与 ThreadPoolExecutor 不同,我没有看到设置队列大小的参数。我不知道 ForkJoinPool 如何窃取机制。
//creating the ThreadPoolExecutor
ThreadPoolExecutor executorPool = new ThreadPoolExecutor(2, 10, 60, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(3000), threadFactory, rejectionHandler);
假设我已经创建了 10 个线程的 ThreadPoolExecutor,并且已经提交了 3000 个 Callable 任务。这些线程如何分担子任务的执行负载?
对于相同的用例,ForkJoin 池的行为如何不同?