为什么建议不同业务使用各自不同线程池

  1. 更清晰的业务名称
    在普通日志和jstack输出时,带包含信息名称。通过线程名称,我们可以通容易确定正在进行的业务;反之,我们需要结合更多信息去判断。
  2. 各业务独立运行,互不影响
    不同的业务相互独立,减低共用线程池可能带来的影响。
    示例1:
    假如有A、B两个业务,A业务耗时10s,B业务耗时10ms。使用不同线程池子,通过操作系统调度,虽然总的时间差不多,但A、B业务的执行时间与期望的时间都会比较接近;反之,当A业务将核心线程占满时,B线程执行完成的时间可能是期待的上百倍。
    示例2:
    若多个业务线程池完全独立,当一个业务出现故障时,比如出现死锁或意外的大任务,其他业务不受影响,只影响某一块业务而已;反之,影响范围会更大。
  3. 更好地定位线上的问题
    当线程池出现故障时,通过线程池可以很快确定是哪块业务的问题。
  4. 避免存在嵌套调用出现的线程循环等待的问题
    在这里插入图片描述

问题流程见上图,第2步提交的任务进入等待队列(第1步提交任务已将线程池的核心线程耗尽),则第4步拿不到返回结果,会出现第4步和第2步相互等待执行完,导致流程无法正常结束的问题。(业务A需要等业务B执行完成才能将线程还回线程池,但业务B又需要等业务A执行完才能有线程去执行)


public class NestedWaiting {

    public static final ExecutorService executor = Executors.newFixedThreadPool(1);

    public static void main(String[] args) {
        executor.execute(() -> {
            try {
                doBiz1();
            } catch (Throwable ignored) {
            }
        });
    }

    private static void doBiz1() throws ExecutionException, InterruptedException {
        System.out.println("hello, biz1");
        Future<String> biz2Result = executor.submit(() -> doBiz2());
        System.out.println("hello" + biz2Result.get());
    }


}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值