Java 8 ForkJoinTask - 即使子任务成功完成,主线程也会挂起
Java 8 ForkJoinTask - main thread hangs even though child tasks complete successfully
为什么尽管子任务完成了,但以下任务永远不会完成? 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();
}
}
显然,即使在执行数据库操作时,将 EntityManagerFactory 创建为静态变量也会导致此问题。关闭 EMF 解决了问题,但由于 EMF 是线程安全的(但 EntityManager 不是),因此没有理由在我每次访问数据库时都创建和关闭 EMF。这可能是一个 Hibernate 问题,我没有进一步调查。我改用 Spring Boot Data JPA。
为什么尽管子任务完成了,但以下任务永远不会完成? 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();
}
}
显然,即使在执行数据库操作时,将 EntityManagerFactory 创建为静态变量也会导致此问题。关闭 EMF 解决了问题,但由于 EMF 是线程安全的(但 EntityManager 不是),因此没有理由在我每次访问数据库时都创建和关闭 EMF。这可能是一个 Hibernate 问题,我没有进一步调查。我改用 Spring Boot Data JPA。