好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

多线程到底如何执行

多线程到底如何执行

由一个简单的例子来分析多线程的执行,先看看简单的例子,代码如下:

 class   Program
    {
          static   int  count =  0  ;

          static   void  Main( string  [] args)
        {
              for  ( int  i =  0 ; i <  10 ; i++ )
            {
                Thread t  =  new   Thread(Run);
                t.Name  =  i.ToString();
                t.Start();
            }

            Console.Read();
        }

          static   void   Run()
        {
             ++ count;
            Console.WriteLine(  "  当前线程:{0},Count值为:{1}  "  , Thread.CurrentThread.Name, count);
        } 

程序在本机上的执行结果,如上图所示。如果电脑的Cpu比较好的,可能执行的结果跟单线程差不多。

下面来分析下执行结果:

 for循环依次开了十个线程,然后调用了线程的Start方法。Start方法在MSDN的摘要为:导致操作系统将当前实例的状态更改为 System.Threading.ThreadState.Running。要注意的是调用线程的Start方法,并不代表线程能马上启动起来(也许CPU正在忙其他的事情)。如何判断线程真的执行起来呢,只需要借助线程的IsAlive属性。 
 接下来,只根据上面的执行结果,看程序到底是如何跑的。

"线程0",启动,线程立刻进入执行状态,执行Run()方法,静态字段count加1,输出当前线程名称,以及Count值。
 "线程1",启动,线程立刻进入执行状态,执行Run()方法,静态字段count加1,执行输出,没有完成输出。 
 "线程2",启动,线程立刻进入执行状态。执行Run()方法,静态字段count加1,立即输出当前线程名称,以及Count值。 
 "线程1" 完成输出。 
 "线程3",启动,线程立刻进入执行状态。执行Run()方法,静态字段count加1,立即输出当前线程名称,以及Count值。 
 "线程4",启动,线程立刻进入执行状态。执行Run()方法,静态字段count加1,还未执行输出。 
 "线程5",启动,线程立刻进入执行状态。执行Run()方法,静态字段count加1,还未执行输出。 
 "线程4",完成执行输出。 
 "线程5",完成执行输出。 
 下面的结果就不分析了。 

如何保证静态字段Count加一后,完成输出,下一个线程才能调用Run方法,也就是说Run方法,在当前线程执行完后,下一个线程才能执行。在实际编程中,这是经常会遇到的。
我知道的有两个方法(都是对临界资源进行加锁),第一个使用lock,第二个是借助于Monitor的Enter、Exit方法。两个方法都需要一个静态的Object对象,当做临界资源。代码如下:

  static   object  lockObj =  new   object  ();
 
     lock   (lockObj)
            {
                 ++ count;
                Console.WriteLine(  "  当前线程:{0},Count值为:{1}  "  , Thread.CurrentThread.Name, count);
            } 

 static   void   Run()
        {
            Monitor.Enter(lockObj);
             ++ count;
            Console.WriteLine(  "  当前线程:{0},Count值为:{1}  "  , Thread.CurrentThread.Name, count);
            Monitor.Exit(lockObj);
        } 


  

 

分类:  C#

标签:  C# 线程

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于多线程到底如何执行的详细内容...

  阅读:44次