简单的Thread

来源:互联网 发布:联合利华二级销售 知乎 编辑:程序博客网 时间:2024/06/10 06:26

简单的Thread



前言

 

今天情人节,也没送女朋友啥,挺女朋友说他们公司的女同事都收到了花,本来我还想说说我女朋友,说她别爱慕虚荣啥的,但是仔细一想,一年到头啥都没给她买过,还享不了啥福,因为我是个没穷的穷屌丝啊,,奋斗吧!

 

 

正文

 

CLR(还记得是啥玩意嘛)OS会自动的为应用程序创建一个线程,这个线程叫做主线程.

 

如果要创建一个新的线程,可以使用Thread.下面是一个简单的案例:

    class Program    {        static void Main(string[] args)        {            Thread t = new Thread(WriteY);//创建一个新的线程来执行WriteY方法            t.Start();             //在主线程上做点事情            for (int i = 0; i < 1000; i++)            {                Console.WriteLine("X");            }            Console.Read();        }        static void WriteY()        {            for (int i = 0; i < 1000; i++)            {                Console.WriteLine("Y");            }        }     }


 

分析:首先创建了一个线程来执行WriteY方法,然后调用Start()来启动创建的线程,接着在主线程中用for循环输出”X”.

 

很容易就应该猜到答案,不是猜:

XY间隔出现,但不是规律性的出现.你自己试试输出结果就懂了

 

一旦线程启动了,线程的IsAlive属性在线程结束前就会返回True,当传递给线程的构造函数中的委托执行完毕,线程就结束了,一旦线程结束了,线程是不可能再重新启动的.

 

CLR为每一个县城分配独立的内存站,这样就可以保证局部变量隔离.下面是使用局部变量的例子.

 

    class Program    {        bool done;        static void Main(string[] args)        {            Program tt = new Program();            new Thread(tt.Go).Start();            tt.Go();            Console.Read();        }        void Go()        {            if (!done)            {                done = true;                Console.WriteLine("done");            }        }     }


 

分析:因为

new Thread(tt.Go)

tt.Go()

方法都共享done字段.

 

所以

Console.WriteLine(“done”);

会且只会被执行一次.

 

我们修改上面的代码将done变量和Go函数声明为static.

那么问题来了,Console.WriteLine(“done”)会被执行几遍?

答案很简单:有时候一遍有时候两遍,你多执行几次.

 

因为静态变量会被所有线程共享.

 

执行一遍的时候就不说了,比较简单.

 

执行两遍:线程A指定到if(!done)此时donefalse.所以通过了if判断,同时线程B也执行到了if(!done)此时done也为false,所以也通过了判断.

 

如果你把上面的代码改为如下这样:

      

  static bool done;        static void Main(string[] args)        {            new Thread(Go).Start();            Go();            Console.Read();        }        static void Go()        {            if (!done)            {                //两个程序都到了这里                Console.WriteLine("done");                done = true;            }        }

这种现象就叫做线程安全,或者说缺少安全,你想想,当你买火车票的时候,还有最后一张票,你点了买入,还有别人也点了买入,要是你俩还能解决,一人坐一会,你想想火车站一天卖多少票啊,玩意正好有一百个人和你买了同一张票呢?

 

虽然new Thread(tt.Go)tt.Go方法都共享ttdone字段,但是两个线程可能都通过了if判断,所以CW方法可能会被执行两遍.



小小的结一下

  这线程啥的,说起来很吊,说实话个人感觉对绝大多数开发者用处不大,起码于我来说.

0 0
原创粉丝点击