【实战总结】线程池异常处理策略

简单谈谈线程池在使用过程中出现异常的一些处理策略,合理使用线程池,必须能够识别主线程与线程池直接的关系、充分了解线程池机制,发挥优点,了解盲区,合理利用不留坑。

先demo几个例子,有时间展开论述下使用场景和异常处理。

/**
 * created by guanjian on 2020/6/18 15:30
 */
public class ThreadPoolExecutorTest extends BaseTest {
 
    @Resource
    private ThreadPoolTaskExecutor taskExecutor;
 
    @Test
    public void execute() {
        System.out.println("BEGIN-execute");
 
        IntStream.range(0, 10).forEach(x ->
                taskExecutor.execute(() -> {
                            //子线程异常抛出,不会阻塞主线程,而且可以立刻看到异常
                            throw new RuntimeException("error");
                        }
                )
        );
 
        System.out.println("END-execute");
    }
 
    @Test
    public void execute_countDownLatch() {
        System.out.println("BEGIN-execute-countDownLatch");
 
        final CountDownLatch cdl = new CountDownLatch(10);
 
        IntStream.rangeClosed(0, 10).forEach(x ->
                taskExecutor.execute(() -> {
                            try {
                                throw new RuntimeException("error");
                            } finally {
                                //如果使用多线程处理,必须用finally处理cdl.countDown(),以免子线程处理异常
                                cdl.countDown();
                            }
                        }
                )
        );
 
        try {
            //阻塞主线程,直到线程池处理完毕或超时
            cdl.await(5, TimeUnit.SECONDS);
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        System.out.println("END-execute-countDownLatch");
    }
 
    @Test
    public void submit() {
        System.out.println("BEGIN-submit-unfutureGet");
 
        IntStream.range(0, 10).forEach(x ->
                taskExecutor.submit(() -> {
                            //submit使用future进行处理,异常会存储在临时变量中,触发异常抛出需要调用future.get()
                            //这里没有进行future.get()调用,出现异常会存在临时变量中不会抛出而是被“吞掉”,好处是不影响并行的其他线程任务,不好是永远不知道是否异常
                            throw new RuntimeException("error");
                        }
                )
        );
 
        System.out.println("END-submit-unfutureGet");
    }
 
 
    @Test
    public void submit_futureGetException() {
        System.out.println("BEGIN-submit-futureGet");
 
        IntStream.range(0, 10).forEach(x -> {
                    Future future = taskExecutor.submit(() -> {
                                //submit使用future进行处理,异常会存储在临时变量中,触发异常抛出需要调用future.get()
                                throw new RuntimeException("error");
                            }
                    );
                    try {
                        future.get();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (ExecutionException e) {
                        e.printStackTrace();
                    }
                }
        );
 
        System.out.println("END-submit-futureGet");
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大摩羯先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值