简单的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”.
很容易就应该猜到答案,不是猜:
X和Y间隔出现,但不是规律性的出现.你自己试试输出结果就懂了
一旦线程启动了,线程的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)此时done为false.所以通过了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方法都共享tt的done字段,但是两个线程可能都通过了if判断,所以CW方法可能会被执行两遍.
小小的结一下
这线程啥的,说起来很吊,说实话个人感觉对绝大多数开发者用处不大,起码于我来说.
- 简单的Thread
- windows thread的简单使用
- 一个简单的Thread类
- Thread+Handler的简单例子
- boost::thread的简单应用
- 简单高效的开Thread的方法
- smart thread pool 【1】简单的使用
- boost Thread 最简单的小例子
- 一段 简单的 multi-thread 代码
- 一个简单的java Thread代码
- Android-Handler, Thread, Runnable的简单应用
- 一个简单Thread缓冲池的实现
- thread包 一个简单的线程实例
- Java -- Thread的两种简单使用方法
- C#Thread 线程的简单使用
- 关于Thread类的简单使用
- 一个简单的Thread缓冲池的实现
- 一个简单的Thread缓冲池的实现
- 5416 CRB and Tree
- autolayout - sizeClass - Masonry - 6
- Java中的内存泄露
- 【leetcode】java String.charAt()
- mysql的备份与恢复
- 简单的Thread
- 有return的情况下try catch finally的执行顺序(最有说服力的总结)
- lamp建
- HDU-1166敌兵布阵
- 第五章 引用类型
- POJ 2528 线段树+离散化(水水的线段树+略复杂的离散化)
- ADT升级到23出错,卸载旧版本ADT时出错Cannot complete the install because of a conflicting dependency.
- Python实例浅谈之三Python与C/C++相互调用
- Win10下安装Genymotion出现virtualization engine not found的解决方案