我有一个方法名称someTask
我必须调用 100 次,并且我正在使用异步编码,如下所示。
for (int i = 0; i < 100; i++) {
futures.add(CompletableFuture.supplyAsync(
() -> { someTask(); },
myexecutor
));
}
如果任何线程执行时发生异常someTask()
我想中断所有当前线程并阻止未来线程执行。处理这个问题的最佳方法是什么?
Update:
我在用ThreadPoolTaskExecutor.
由于您似乎没有使用 CompletableFuture 特定方法,因此您可以使用ExecutorService
直接地:
for (int i = 0; i < 100; i++) {
executor.submit(() -> {
try {
someTask();
} catch (InterruptedException e) {
//interrupted, just exit
Thread.currentThread().interrupt();
} catch (Exception e) {
//some other exception: cancel everything
executorService.shutdownNow();
}
});
}
shutdownNow
将中断所有已提交的任务,并且执行者将拒绝新任务的提交,并带有RejectedExecutionException
.
这种方法的主要缺点是 ExecutorService 无法重用,尽管您当然可以创建一个新的。如果这是一个问题,您将需要另一种方法。
请注意,为了使其有效工作someTask()
需要定期检查线程的中断状态并在中断时退出,或者使用可中断的方法。例如如果someTask
是一个运行一些计算的循环,并且您从不检查线程中断状态,该循环将完全运行并且不会停止。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)