Java 8 ForkJoinTask - 即使子任务成功完成,主线程也会挂起

时间:2015-03-04 00:10:03

标签: multithreading concurrency java-8 fork-join

为什么即使子任务执行,以下内容也永远不会完成? 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();
    }
}

1 个答案:

答案 0 :(得分:0)

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