注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

信息 灵感 创新

I? =Information,Inspiration,Innovation

 
 
 

日志

 
 
关于我

we are 5. Mathematics, Computation, Programming, Engineering, and Making fun of life.

网易考拉推荐

C#多线程入门  

2014-12-23 19:06:04|  分类: C# & .NET |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

一、基本概念

C#中使用线程需要命名空间System.Threading,因此在后面的代码中不再重复使用此命名空间。

如何创建线程

创建线程需要使用线程类Thread,创建一个新线程类似于使用一个代理,看下面的代码:

namespace MultiThreadLernen
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread t = new Thread(PrintO);
            t.Start();
            PrintX();
        }

        static void PrintO()
        {
            for (int i = 0; i < 10; i++)
                Console.WriteLine("O");
        }

        static void PrintX()
        {
            for (int i = 0; i < 10; i++)
                Console.WriteLine("X");
        }
    }
}

这个程序运行的效果大概像图1这样:

p1

 图1

注意运行的结果极有可能不一样。

1. 几个小问题

最直观的问题就是,为什么每次运行的结果都不一样?操作系统和CLR在一个C#程序运行时,会自动为其创建一个主线程,通过创建其他线程,实现多线程。多个线程之间是“同时”运行。这个图能很好地诠释这一过程:

 

p2

图2

这个“同时”,实际上是一种并发运行机制,两个进程都需要使用资源(控制台输出),谁是当前进程谁就执行。

另一个问题是进程中的变量。CLR为每一个进程分配内存栈,因此,各个进程之间的局部变量是相互独立的。下段代码可以表明:

namespace MultiThreadLernen

{
    class Program
    {
        static void Main(string[] args)
        {
            Thread t = new Thread(PrintNum);
            t.Start();
            PrintNum();
            
        }

        static void PrintNum()
        {
            int i = 0;
            do 
            { 
                Console.WriteLine(i);
                i++;
            } while (i<10);
               
        }
    }
}

程序运行的步骤也是不可预料的,但是可以肯定的是,0-9之间的数字都被显示了两次。

当然,线程也不是不能共享变量,只要变量指向的是同一个对象,还是没问题的。看下面的代码:

namespace MultiThreadLernen

{
    class Program
    {
        static int i;
        static void Main(string[] args)
        {
            i=0;
            Thread t = new Thread(PrintNum);
            t.Start();
            PrintNum();            
        }

        static void PrintNum()
        {
            do 
            { 
                Console.WriteLine(i);
                i++;
            } while (i<10);               
        }
    }
}

显示效果大概如下:

image 图3

显示结果表明,并不是每个数字都出现两遍,而是同步地进行,而且,当一个线程在判断i是否小于10的时候,另一个线程就在控制台显示了,一旦i达到9,就停止了。

  评论这张
 
阅读(532)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016