我正在使用
ThreadPoolExecutor.submit
创建多个 future 以并行写入数据库。
for(BusinessElement el : elements){ list.add(threadPoolExecutor.submit(() -> createElement(el))); }
所以我想做的是当一个提交失败时停止所有执行,意味着当一个提交失败时它 应该停止所有活动线程的执行并从 foreach 块中退出。
他们有什么优雅的解决方案吗?
如果可以,请使用结构化并发:
try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
...
scope.fork(() -> createElement(el));
scope.join();
}
如果无法选择结构化并发,请使用 tascalate-concurrent。它是
CompletionStage
的实现,适用于 I/O 任务,可中断且组合合理,没有任何可以说为 CompletableFuture
的实现。