我有个办法
private void disableXYZ(Long rId, List<Long> disableIds, String requestedBy) {
for (Long disableId : disableIds) {
try {
disablePackXYZ(UnSubscribeRequest.unsubscriptionRequest()
.requestedBy(requestedBy)
.cancellationReason("system")
.id(disableId)
.build());
} catch (Exception e) {
log.error("Failed to disable pack. id: {}, rId: {}. Error: {}", disableId, rId, e.getMessage());
}
}
}
我想使用disableIds列表中的id对disablePackXYZ进行并行方法调用,而不是迭代for循环。但这样做时,如果任何一个或多个disablePackXYZ调用引发异常,我不想中止所有并行调用。我可以捕获或抑制异常,但它不应中止所有其他线程的处理或同一线程的后续任务的处理。请建议相同的方法。
我通过网络浏览了java流方法-
final CompletableFuture<ParseException> thrownException = new CompletableFuture<>();
Stream.of(columns).parallel().forEach(column -> {
try {
result[column.index] = parseColumn(valueCache[column.index], column.type);
} catch (ParseException e) {
thrownException.complete(e);
}});
对于上面的方法,我在网上发现,如果线程中至少有一个异常抛出,forEach调用会将它(或其中一个)传播给调用者。因此,当前实现在遇到异常时不会等待所有线程完成。
1条答案
按热度按时间ilmyapht1#
你已经有了一个result[]数组来存储结果,只需要创建一个error[]数组来存储异常。在你的catch语句中,把异常存储到error[]数组中,不要调用thrownException.complete(e)。