请教一个 Java 线程池问题,子线程会自己挂掉吗?

查看 50|回复 5
作者:3country   
代码逻辑如下:
public void fun() {
        List[I] list = new ArrayList();
        for(int i = 1; i  partition = Lists.partition(list, batchSize);
        for (List[I] itemList : partition) {
            executorService.execute(() -> subFun(itemList));
        }
    }
    private void subFun(List[I] list) {
        String threadName = Thread.currentThread().getName();
        log.info("子线程{}开始执行。。。", threadName);
        for (Integer i : list) {
            .....
        }
        log.info("子线程{}执行总数:{}", threadName, list.size());
    }
总结就是将数据分为 3 块,并行执行,最终的日志结果是,子线程有 3 个开始执行了,却只有 2 个执行完,日志里没有异常信息,方法里也没有 return 的逻辑,有大佬给点排查思路吗
StinkyTofus   
你是跑的单元测试吗? 是不是因为主线程在子线程完成之前结束了, 导致进程停了。 可以在主线程尾部加个 sleep
3country
OP
  
@StinkyTofus 拿单元测试做了个例子,实际是晚上跑的定时任务
StinkyTofus   
除了我上面说的可能性, 就是你 executorService 的队列设置的太小了, 超过的任务被丢弃了。 正常的情况下子线程肯定会被执行, 没有抛出异常的情况下,不会自己挂掉。
3country
OP
  
@StinkyTofus log.info("子线程{}开始执行。。。", threadName)这一行代码每一个子线程都执行了,我感到疑惑的是为什么有一个线程没有执行完方法,也没有异常信息
StinkyTofus   
@3country #4 不是都说了么,你跑的单元测试不能验证你提出的问题, 主线程提前结束了, 加个 sleep 就行了。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部