代码逻辑如下:
```java
public void fun() {
        List<Integer> list = new ArrayList<>();
        for(int i = 1; i <= 12345; i++) {
            list.add(i);
        }
        int total = list.size();
        int batchSize = total / 3;
        List<List<Integer>> partition = Lists.partition(list, batchSize);
        for (List<Integer> itemList : partition) {
            executorService.execute(() -> subFun(itemList));
        }
    }

    private void subFun(List<Integer> list) {
        String threadName = Thread.currentThread().getName();
        log.info("子线程{}开始执行。。。", threadName);
        for (Integer i : list) {
            .....
        }
        log.info("子线程{}执行总数:{}", threadName, list.size());
    }

```
总结就是将数据分为 3 块,并行执行,最终的日志结果是,子线程有 3 个开始执行了,却只有 2 个执行完,日志里没有异常信息,方法里也没有 return 的逻辑,有大佬给点排查思路吗
举报· 122 次点击
登录 注册 站外分享
10 条回复  
StinkyTofus 小成 2024-9-3 10:48:06
你是跑的单元测试吗? 是不是因为主线程在子线程完成之前结束了, 导致进程停了。 可以在主线程尾部加个 sleep
cmai 小成 2024-9-3 11:01:36
怎么确定的没有异常信息?我看你方法里也没有 try catch
sagaxu 初学 2024-9-3 11:09:47
子线程不会自己挂掉。

executorService 可以是 daemon 也可以是非 daemon ,当他为 daemon 时,main 线程退出时,JVM 进程会结束,executorService 可能执行不完。

1. 确定 main 里面等待 executorService 执行完
2. 任务里面用 try-catch 包住,记录异常
MozzieW 小成 2024-9-3 11:21:52
1. 直接点,多加日志,try catch ,看能不能找到问题
2. 喝口水,上个厕所,回来代码多看几次
lujianwen9 小成 2024-9-3 11:40:54
executorService  没加异常处理吧
AlanBrian 初学 2024-9-3 11:50:14
没有异常处理不会输出到日志文件的
ArthurTsang 小成 2024-9-3 11:52:25
子线程 catch 下异常吧
fengpan567 小成 2024-9-3 11:55:03
为啥不先看看 error 日志
magicZ 小成 2024-9-3 13:22:24
我也这么干过跑数据,比这个还粗暴直接 new 了 30 个线程跑,跑完生成文件。然后第二天我发现有几个文件没生成,也没有异常日志,检查几遍后发现就是 try catch 没指定的异常不对(代码自动生成的 IOException, 实际是 NPE 报错),导致线程挂了也没报错。
12下一页
返回顶部