起名字好烦啊 2021-08-24 17:38 采纳率: 0%
浏览 25

java多线程-主线程等待多个子线程处理结果,子线程结果不完整

public class ThreadTest {

public static void main(String[] args) {
    System.out.println("main begin");
    CountDownLatch cunt = new CountDownLatch(5);
    List<String> out = new ArrayList<>();
    ExecutorService executorService = Executors.newFixedThreadPool(5);
    for (int i=0;i<5;i++){
        executorService.execute(new TaskTest(i+"",cunt,out));
    }
    try {
        cunt.await();
    }catch (Exception e){

    }
    executorService.shutdown();
    System.out.println(out);
    System.out.println("main out");
}

}
@Data
@NoArgsConstructor
@AllArgsConstructor
class TaskTest implements Runnable{

private String name;
private CountDownLatch countDownLatch;
private List<String> result;

@Override
public void run() {
    countDownLatch.countDown();
    result.add(Thread.currentThread().getName()+":"+name);
    System.out.println("thread:"+name);
}

}
主线程中打印的out理论上应该是:[11, 11, 11, 11, 11],但是会出现[null, 11, 11, 11, 11]或者[null, null, 11, 11, 11],是什么原因?

  • 写回答

3条回答 默认 最新

  • CSDN专家-sinJack 2021-08-24 17:59
    关注

    不用线程池的话,主线程中可以通过监测子线程的状态来判断。

    public static void main(String[] args) {
        System.out.println("main start");
        ThreadGroup tg = new ThreadGroup("Parent ThreadGroup");
        for (int j = 0; j < 10; j++) {
            new Thread(tg, "t" + j) {
                public void run() {
                    System.out.println("Thread: " + getName() + " running");
                    int small = 0;
                    int large = 10;
                    try {
                        Thread.sleep(1000 * (int) (Math.random() * (large - small + 1) + small));
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }.start();
        }
        while (tg.activeCount() > 0) {
            try {
                System.out.println("Waiting for " + tg.activeCount() + " CThreads to Complete");
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("main end");
    }
    
    评论

报告相同问题?

问题事件

  • 创建了问题 8月24日

悬赏问题

  • ¥15 WPF动态创建页面内容
  • ¥15 如何对TBSS的结果进行统计学的分析已完成置换检验,如何在最终的TBSS输出结果提取除具体值及如何做进一步相关性分析
  • ¥15 SQL数据库操作问题
  • ¥100 关于lm339比较电路出现的问题
  • ¥15 Matlab安装yalmip和cplex功能安装失败
  • ¥15 加装宝马安卓中控改变开机画面
  • ¥15 STK安装问题问问大家,这种情况应该怎么办
  • ¥15 关于罗技鼠标宏lua文件的问题
  • ¥15 halcon ocr mlp 识别问题
  • ¥15 已知曲线满足正余弦函数,根据其峰值,还原出整条曲线