zoukankan      html  css  js  c++  java
  • 多线程到底如何执行

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

    复制代码
    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# 线程
  • 相关阅读:
    开源快速开发平台 WebBuilder 6.58 final 发布。
    快速开发平台 Putdb WebBuilder 6.9
    Java Web开发平台 WebBuilder访谈 (Web开发工具,Web开发框架,Web快速开发)
    软件定制开发工具 WebBuilder 6.5 发布
    Web开发框架
    几款Web快速开发平台比较
    利用sql批量删除表,存储过程。
    一个简单的在线客服的实现(漂浮在网站左侧,随页面滚动
    (转载)input中id和name属性的区别。
    关于seo大家给点建议吧。
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2521770.html
Copyright © 2011-2022 走看看