当前位置: 首页 > 知识库问答 >
问题:

ForkJoinpool::关闭vs ForkJoinpool::关闭现在在ForkJoinpool::加入之后

公宜春
2023-03-14

代码:

            final ForkJoinPool forkJoinPool = new ForkJoinPool(PARALLELISM_NUMBER);
            try {
                final List<Record> records = getRecrods();
                List<List<Record>> partitionRecordLists = Lists.partition(records, BATCH_SIZE);

                forkJoinPool.submit(() ->
                        partitionRecordLists.parallelStream().forEach(this::performSomething)
                ).join();
                
            } finally {
                forkJoinPool.shutdown();
            }

我有上面的代码来并行执行一些任务。考虑到join已经让调用线程等待完成,不知道它是否应该是shoutdownow()而不是finally块中的shoutdown()

注意:performSomething仅从输入列表中读取。

共有1个答案

司寇烨伟
2023-03-14

通常:shutdown()表示您正在为executor服务执行干净/有序的关机操作,Shutdownow() 用于特定情况-通常用于错误处理或绕过任何未启动且不太重要的后台服务。

在您的情况下,使用join()不会有任何区别。然而,考虑另一个维护代码的人: Cube()/代码>在代码块内部是不太明显的,因此他们会发现看到<代码> FokCuangCube感到奇怪。关闭现在() 在结尾处没有注释来解释为什么这是可以的,而 shutdown()是更明显的更简洁的方式来指示池结束处理已经完成。

final ForkJoinPool forkJoinPool = new ForkJoinPool(...);
try {
    // Long block:
    // harder to spot join() here whereas shutdown() stands out
} finally {
    forkJoinPool.shutdown();
}

 类似资料:
  • 我们正在尝试创建一个带有两个Docker容器的Hazelcast集群,并从客户端应用程序访问它,但我们可以启动一个Hazelcast容器,而启动另一个容器时,getting无法加入集群。现在关机。例外 我们使用以下命令启动docker容器。

  • 我尝试使用ForkJoinpool来并行化我的CPU密集型计算。我对ForkJoinpool的理解是,只要有任何任务可以执行,它就会继续工作。不幸的是,我经常观察到工作线程空闲/等待,因此不是所有的CPU都保持忙碌。有时我甚至观察到额外的工作线程。 我没有想到这一点,因为我严格尝试使用非阻塞任务。我的观察与ForkJoinpool的观察非常相似,似乎浪费了一根线。在调试了很多到ForkJoinpo

  • 问题内容: 具有单个节点的集群: betwwen和有什么不一样 和 ? 从Java正常关闭节点/集群的推荐方法是什么? 问题答案: 上述两个操作具有相同的效果。区别可能是它们影响的节点。 随着你关闭了自己的节点,从您的应用程序,它可以是你,如果你嵌入在应用程序中elasticsearch集群,或者只是一个客户端节点的唯一节点开始是通过Java API连接到外部集群(传输端口)。 使用节点关闭api

  • 我最近转到了一个项目,在这个项目中我遇到了很多这种性质的代码--(这是使用jdbc postgres驱动程序) 显然,这段代码已经在生产中运行了一段时间,没有引起问题。 为了进一步澄清,如果我的理解是正确的(即,statement和resultset必须在连接关闭之前而不是之后关闭),我需要在catch和finally之间重复一些代码。修订后的代码如下所示。这可以简化吗? 只是为了透视,这段代码是

  • 问题内容: 我在try / catch块中有以下代码 我的问题是,当我必须在finally块中关闭这些流时,是否必须关闭所有3个流,或者仅关闭 befferedreader 会关闭所有其他流? 问题答案: 按照惯例,包装流(用于包装现有流)在关闭时会关闭基础流,因此仅在示例中必须关闭。而且,关闭已经关闭的流通常是无害的,因此关闭所有3个流都不会受到伤害。

  • 我有一个ExecutorService创建如下- 我有一个元素列表(list)和一个操作(称为a),我需要对列表中的每个元素应用该操作。列表可以包含1到1000之间的任意数量的元素。该操作的类型为Callable。在操作A内部,它调用其他2个服务B和C。B和C也作为异步操作运行,并提交到同一线程池。 我为每个人创建了一个异步任务来并行执行,如下所示: 现在我有了一个未来的列表,我在上面循环得到结果