java—嵌套的executorservice可以并行运行吗

cotxawn7  于 2021-07-03  发布在  Java
关注(0)|答案(0)|浏览(318)

编辑:更改了标题并重新格式化了我的代码:(请接受我的问题,我是这个平行世界的新成员)
我现在不是使用fjpool,而是使用executorservice来并行化我的任务。所有任务和子任务都是独立的,可以并行运行而不发生任何冲突。下面是我的代码片段:

ExecutorService executor = Executors.newFixedThreadPool(2);
executor.submit(() -> someTask(args1);
executor.submit(() -> someTask(args2);
// Wait for tasks to complete and shutdown executor

private static void someTask( ... ) {
    ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
    // executor runs a bunch of tasks in parallel here and then shutdown executor
}

我的问题是,如果我需要调整线程池的数量,因为并行运行的两个任务试图创建的线程池的大小与可用内核的大小相同?在我们通过关闭来释放线程之前,这会起作用还是会阻塞一个初始任务?
=======初始问题=====
我的问题和这个问题略有不同。我有两个任务,sometask1和sometask2,我计划并行化。问题是(我不确定这是否是个问题)sometask1使用forkjoinpool并并行运行一系列其他任务。我是否可以使用forkpooljoin(类似于下面的代码)并行化sometask1和sometask2两个任务,即使我正在并行化的任务之一并行运行其他任务?如果可能的话,我可以在重构以下代码方面得到一些帮助:

ForkPoolJoin forkJoinPool = new ForkJoinPool(parallelism);
if (someCond1) {
    forkJoinPool.submit(() -> someTask1( ... ));
}
if (someCond2) {
    forkJoinPool.submit(() -> someTask2( ... ));
}
// I want to wait here until forkJoinPool is done with both tasks (or either of the 1 based on each condition)?

private void someTask1( ... ) {
    ForkPoolJoin forkJoinPool = new ForkJoinPool(parallelism);
    try {
        forkJoinPool.submit(() -> someStream.stream().map( ... ))
                    .get(); // Wait for all the tasks to complete
    } finally {
        forkJoinPool.shutdown();
    }
}

编辑:我想出了一个解决等待问题的方法。我的解决方案是,因为我只有两个并行任务,所以我将forkjoinpool.submit的结果存储到两个未来的变量中,并逐个调用它们的get()函数。如果其他人有更好的更通用的解决方案,那就太好了。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题