请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

这里如果用线程池打印i的话为什么一直是100呢?

        a = new List<int>();
        a.Add(0);

        for (int i = 0; i < 100; i++)
        {
            //var t = new Thread(() =>{
            //    Console.WriteLine(i + " " + Thread.CurrentThread.ManagedThreadId);
            //});
            //t.Start();
            ThreadPool.QueueUserWorkItem((o) =>
            {
                a[0] = a[0] + 1;
                Console.WriteLine(i + " " + Thread.CurrentThread.ManagedThreadId);
            });

        }
        Thread.Sleep(1000);
        Console.WriteLine("quit " + a[0]);

结果如下

图片描述

为什么i一直是100呢?

正在回答 回答被采纳积分+3

1回答

阿莱克斯刘 2022-06-27 00:36:25
这个问题非常好,要回答这个问题需要先研究一下14-7关于线程锁和资源竞争内容。因为for循环中的i实际上是被100个线程共享的,所以,当i发生变化的时候会直接影响所有的线程。而for循环中线程池中的线程会先完成所有的线程创建,然后再以回调的方式的执行。而在线程池内线程执行的时候,其实100线程已经全部创建完成了,也就是说for循环已经结束了,也就是说此时i的取值为100。所以,我们看到的所有i的输出全部都是100。
0 回复 有任何疑惑可以回复我~
  • 提问者 慕前端8369922 #1
    老师在这个地方可以有办法让i输出原本的数据而不都是100嘛?
    回复 有任何疑惑可以回复我~ 2022-06-27 01:05:34
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信