【问题标题】:Java 8 ForkJoinTask - main thread hangs even though child tasks complete successfullyJava 8 ForkJoinTask - 即使子任务成功完成,主线程也会挂起
【发布时间】:2015-03-05 03:02:46
【问题描述】:

为什么即使子任务完成,以下任务也永远不会完成? miner.mine 做了一些我可以看到已完成的数据库插入,但提示永远不会回来。

private void run(Path path) {
    findAllFilesInDirectory(path).forEach(
        p -> ForkJoinTask.adapt(() -> miner.mine(p)).invoke());
}

private Stream<Path> findAllFilesInDirectory(final Path path) {
    try {
        return find(path, 1,
            (p, fileAttributes) -> fileAttributes.isRegularFile());
    } catch (IOException e) {
        LOGGER.error("There was an error processing path: {}.", path);

        return Stream.empty();
    }
}

【问题讨论】:

    标签: multithreading concurrency java-8 fork-join


    【解决方案1】:

    显然,即使在执行 DB 操作时,将 EntityManagerFactory 创建为静态变量也会导致此问题。关闭 EMF 解决了这个问题,但由于 EMF 是线程安全的(但 EntityManager 不是),所以每次访问数据库时都没有理由创建和关闭 EMF。这可能是一个休眠问题,我没有进一步调查。我改用 Spring Boot Data JPA。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多