我需要停止在ThreadPool
中执行线程,以防它们中的任何一个抛出异常。
我的解决方案之一就是引用每个ExecutorService
上的Runnable
并在其上调用shutdownNow()
。不确定这是否正常。实际代码更复杂,因为它涉及电子邮件发送作为一项任务,但我简化了插图:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
public class Concurrency {
private static AtomicInteger counter = new AtomicInteger();
public static void main(String[] args) {
ExecutorService exec = Executors.newFixedThreadPool(5);
for (int i = 0; i < 20; i++) {
exec.execute(new Tasku(exec));
}
}
public static class Tasku implements Runnable {
ExecutorService executorService;
public Tasku(ExecutorService executorService) {
this.executorService = executorService;
}
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
System.out.println(counter.incrementAndGet());
if (counter.intValue() == 10) {
try {
throw new ArrayIndexOutOfBoundsException();
} catch (ArrayIndexOutOfBoundsException e) {
executorService.shutdownNow();
}
}
}
}
}
}
上面的例子工作,在计数器的第10个增量停止之后。控制台输出:
1
4
6
7
5
9
3
2
10
8
这是处理场景的好方法吗?如果没有,怎么样?
由于
答案 0 :(得分:1)
这是一个合理的解决方案。您可以通过重写Executor.exec(Runnable r)并提交新的Tasku(r)而不是r来改进它。这样Executor的界面保持不变。