这里如果用线程池打印i的话为什么一直是100呢?
来源:14-4 【操作】前台线程、后台线程与线程池托管

慕前端8369922
2022-06-25
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呢?
写回答
1回答
-
阿莱克斯刘
2022-06-27
这个问题非常好,要回答这个问题需要先研究一下14-7关于线程锁和资源竞争内容。因为for循环中的i实际上是被100个线程共享的,所以,当i发生变化的时候会直接影响所有的线程。而for循环中线程池中的线程会先完成所有的线程创建,然后再以回调的方式的执行。而在线程池内线程执行的时候,其实100线程已经全部创建完成了,也就是说for循环已经结束了,也就是说此时i的取值为100。所以,我们看到的所有i的输出全部都是100。012022-06-27
相似问题