如果发生异常,则停止ThreadPool中的所有线程

时间:2013-11-18 18:30:04

标签: java multithreading threadpool java.util.concurrent

我需要停止在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

这是处理场景的好方法吗?如果没有,怎么样?

由于

1 个答案:

答案 0 :(得分:1)

这是一个合理的解决方案。您可以通过重写Executor.exec(Runnable r)并提交新的Tasku(r)而不是r来改进它。这样Executor的界面保持不变。