代码之家  ›  专栏  ›  技术社区  ›  shantanu

ForkJoinPool::shutdown与ForkJoinPool::shutdownForkJoinTool::join之后没有

  •  1
  • shantanu  · 技术社区  · 4 年前

    代码:

                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 已经让调用线程等待完成,不知道是否应该 shutdowNow() 而不是 shutdown() 在 finally 块

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

    0 回复  |  直到 4 年前
        1
  •  1
  •   DuncG    4 年前

    一般而言: shutdown(); 意味着您正在为executor服务执行干净/有序的关闭,并且 shutdownNow(); 用于特定情况-通常用于错误处理或绕过任何未启动且不太重要的后台服务。

    在您的情况下,使用时不会有任何差异 join() 。但是,请考虑另一个人维护您的代码: join() 在代码块内部看不太明显,所以他们会觉得很奇怪 forkJoinPool.shutdownNow(); 最后没有评论解释为什么那里还可以,以及 shutdown() 是一种更明显、更整洁的方式,用于指示池结束处理已完成。

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