多线程不加延时就出错

package Thread_Study.synchro;

import java.util.concurrent.CopyOnWriteArrayList;

public class TestJUC {
    public static void main(String[] args) {
        CopyOnWriteArrayList<String> list=new CopyOnWriteArrayList<String>();
        for (int i = 0; i < 10000; i++) {
            new Thread(()->{
                list.add(Thread.currentThread().getName());
            }).start();

        }
        /*try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }*/
        System.out.println(list.size());
    }
}

它出现的结果应该有很多吧,自己大概测试了30次,不加延时出现的可能有:9999、9998、9997

把错误信息贴出来看看,是什么原因产生的问题。

  public static void main(String[] args){
    CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<String>();
    for (int i = 0; i < 10000; i++) {
      new Thread(() -> {
        list.add(Thread.currentThread().getName());
      }).start();

    }
    
    // 只剩下主线程和 GC 线程时才打印数量
    while (Thread.activeCount() != 2);

    System.out.println(list.size());
  }

原理就是,for 循环执行完了,但是不一定执行了 add

size 少了2 是吗?

你意思打印size每次都不一样是吧,因为你创建线程start后也不是立即执行的,主线程创建完1000个线程就打印size了,但1000个线程一定执行完了吗

题注的意思应该是不加睡眠,这个线程数不对,不是10000个,而是少于等于10000个. CopyOnWriteArrayList的数据也少于10000.

大概原因是:main函数主线程可能存在比子线程提前结束任务.

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632