因为在Produce()里,当线程刚开始执行的时候,因为bFlag=false,所以while(bFlag==true);不会循环,就会执行
Console.WriteLine( "Producer{0}",ResourceContent );bFlag = true;语句,导致bFlag=true,这个改变也导致while(bFlag==false);循环退出!
你这线程写法,不确定性太大,写多线程程序千万不要想当然,否则不会得到你预期
的结果!

解决方案 »

  1.   

    和和, C#好象做线程比VC要简单多!
      

  2.   

    To jsc223(jscun):
    谢谢!
    在程序里面,Producer.Join();Consumer.Join();会起怎样的作用?我看书里面的说明是:阻塞调用线程,直到某个线程终止时为止。那Producer.Join();是阻塞哪个线程的,什么时候阻塞?
    可以帮我详细说明一下吗?——线程新手
      

  3.   

    thread.Join()是阻塞当前调用线程,一旦调用就立刻阻塞。直到thread这个线程完成并返回为止,你也可以这样thread.Join(5000)就是阻塞当前线程5秒钟,在这个时间内假如thread现程已经完成的话,可能不用5秒Join()就会返回,假如5秒内thread没有完成,这个Join()也会返回!
      

  4.   

    public class Resource
    {
    int ResourceContent = 0;
    bool bFlag = false; public void Consume()
    {

    lock(this)
    {
    if(!bFlag)
    {
    try
    {
    System.Threading.Monitor.Wait(this);
    }
    catch
    {}
    }
    Console.WriteLine( "Consumer:{0}", ResourceContent );
    Thread.Sleep(200);
    bFlag = false;
    System.Threading.Monitor.Pulse(this);

    }
    } public void Produce()
    {
    lock(this)
    {
    if(bFlag)
    {
    try
    {
    System.Threading.Monitor.Wait(this);
    }
    catch
    {}
    }
    ResourceContent++;
    Console.WriteLine( "Producer:{0}",ResourceContent );
    Thread.Sleep(300);
    bFlag = true;
    System.Threading.Monitor.Pulse(this);

    }
    }
    这是比较简单的线程同步,但很有用了!
      

  5.   

    谢谢!使用lock来锁定和Monitor确实比我所用的那个实在多了.
    还有个问题想请教:
    当线程Start后,直到执行完毕线程函数;那我要重新启动该线程要怎样呢?重新调用Start吗?