悬赏园豆:20
[已关闭问题]
<P> 以下是自己学习多线程时,给自己出的题,发现两次输出的队列长度不一样,源码如下,请帮忙解决,如有更好的实现办法,请指教,诚谢!</P>
<P>using System;<BR>using System.Collections.Generic;<BR>using System.Text;<BR>using System.Threading;<BR>using System.Collections;</P>
<P>namespace ConsoleApplication1<BR>{<BR> //多线程将一个队列的数据转移到另一个队列<BR> class MultiThread8<BR> {<BR> static void Main()<BR> {<BR> Thread[] threads = new Thread[10];<BR> MyQueue myQueue = new MyQueue();<BR> Console.WriteLine("Q1.Count={0}", myQueue.q1.Count);<BR> Console.WriteLine("开始执行多线程");<BR> for (int i = 0; i < threads.Length; i++)<BR> {<BR> threads[i] = new Thread(myQueue.DoFunc);<BR> threads[i].Start();<BR> }</P>
<P> for (int i = 0; i < threads.Length; i++)<BR> {<BR> threads[i].Join();<BR> }<BR> Console.WriteLine("Q2.Count={0}", myQueue.q2.Count);<BR> Console.Read();<BR> }</P>
<P> }</P>
<P> class MyQueue<BR> {<BR> public Queue q1 = new Queue();<BR> public Queue q2 = new Queue();<BR> public MyQueue()<BR> {<BR> for (int i = 0; i < 10000; i++)<BR> {<BR> q1.Enqueue(i);<BR> }<BR> }</P>
<P> public void DoFunc()<BR> {<BR> lock (this)<BR> {<BR> for (int i = 0; i < q1.Count; i++)<BR> {<BR> int t = (int)q1.Dequeue();<BR> q2.Enqueue(t);<BR> //Console.Write("-{0}", t);<BR> Thread.Sleep(10);<BR> }<BR> <BR> Console.WriteLine("-----------");<BR> }<BR> }<BR> }<BR>}</P>
问题补充:
Q1是原队列,Q2是目标队列,目的是用多线程的方式把Q1内容复制到Q2中,疑问是,如果Q1的长度是10000或更长,就会出现Q2的结果小于Q1的长度,之前可能没有描述清楚,
如果设置Q1长度为100或更小,就是正常的,希望有达人解释下原因,或者提供些建议,谢谢