线程—Thread(C#讲解)
本章导读writeline方法的作用
基础篇
1:早晨⼀贴(为什么我们需要⽤多线程)。
2:怎样创建最基本的线程。
3:课后作业。
提⾼篇
1:中午⼀贴(提⾼我们对线程的了解。何为线程同步)。
2:线程同步的⼀些例⼦
3:课后作业。
⾼级篇
1:晚间⼀贴(怎么应⽤⾄我们编写的软件)。
2:Delegate异步线程与UI设计。
3:⾼级⽰例应⽤
基础篇
1:早晨⼀贴
记得上个星期六妈妈对我说:”⼩婷,昨天妈加班太迟了所以⾐服没洗,你早晨的时候把洗了,然后去菜场买菜,中午妈可能回来的⽐较迟,把午饭做好,然后你下午⾃由活动
吧.”不会吧,⾃⼰是个瞌睡⾍,早晨都喜欢睡懒觉的.
算9点起床吧,家⾥三个⼈的⾐服都是我洗,起码需要1个⼩时,玩会电脑需要1个⼩时,骑车去菜场买菜来回需要40-50分钟,做饭需要⼤约1个⼩时,天呀,⼀个早晨的时间就这么没了,多不划算。⼼⾥在嘀咕着如果能少花点时间就好了,幸好可以⽤洗⾐机洗⾐服,曾洗⾐服的时候把饭做好,去菜场买菜,呵呵,那启不是可以节约很多时间呀,如果是⼀个⼯作接着⼀个⼯作做,那真是太浪费时间呢。读者们,听我唠叨了这么多会不会觉得很纳闷呀?这和线程有什么⽠葛,我们花钱买的是技术书,不是
买的读者,知⾳等书刊??其实这正是我们现实⽣活中⾃⼰所想节约时间的办法,其实它就相当于我们程序语⾔的多线程(请个钟点⼯帮我⼀起做事,呵)。
怎样创建最基本的线程
⼀般我们⽤线程的时候需要引⽤System.Threading命名空间,⾥⾯包括我们绝⼤部分都⽤到的线程类Thread。我认为它就是我免费的钟点⼯.呵下⾯是⼀个很简单的线程例⼦
程序输出结果为:Hello C#.是不是很简单了?其实 2.0之后,我们可以借助匿名⽅法使代码更简单化⼀点,下⾯是代码
实少很多了,事实上在C#2.0⾥我们甚⾄可以不必写出ThreadStart委托,那么代码将会变
简便了,这样的代码你愿意写吗?
例⼦写好了,⼤家可以仿照上⾯的代码⾃⼰在VS⾥写⼀下然后编译看看,下⾯主要讲讲Thread类的⼀些⽤法.常⽤的有
Thread.Suspend() //挂起线程(使线程暂时停⽌)
Thread.Resume()  //使挂起的线程开始⼯作
Thread.Abort()    //使线程永远的停⽌
Thread.Join()    //线程之间的插⼊
Thread.Start()  //开始执⾏线程
这些⽅法⽐较简单,我重点讲解⼀下Join的⽤法,代码如下:
程序运⾏结果为bababababababababababababaaaaaaaaaaaaaccccccccccccccccccccccccccccccccccccccccccc,⼤家看出什么端倪了吗?对呢,⼀开始两个线程是同时运⾏的,当线程运⾏⾄Join的时候,那么线程bb将会等到线程tt全部执⾏完之后才执⾏线程bb下⾯的语句。
备注:基本的线程就讲到这⾥了,另外⼤家还需要了解的就是线程的状态,它有正在运⾏,已经结束等等,
名称为ThreadState枚举,线程级别名称为Priority枚举等,这些都是⽐较简单的话题,在这就不重复了。
3:课后作业。
⼤家试着⽤多线程编写⼀些⼩例⼦,把我们所讲的线程的停⽌,恢复,状态,级别等功能都做进去看看。
提⾼篇
1:中午⼀贴
记得⾃⼰读⼩学的时候经常参加学校每年组织的运动会,⽐赛项⽬是接⼒跑。
就是前⾯⼀个⼈把棒⼦传给你的时候你才会继续往前跑,当你跑到下⾯⼀个队员⼿中的时候把接⼒棒传给她,她⼜会继续跑,这样⼀直跑到终点.我们试想下如果我们在没有接到接⼒棒的时候就跑,这样跑到终点可以拿奖吗?显然是不⾏的,如果我们把⼏个⼈跑接⼒棒当作多线程的话,那么接⼒棒就是同步了。
2:线程同步的⼀些例⼦
在C#⾥,框架为我们提供了很多很多线程同步的类,⼀般常⽤的⽐如
InterLocked,Monitor,Mutex, ManualResetEvent, AutoResetEvent,另外还有C#为语⾔为我们提供的Lock关键字.
先讲InterLocked类,个⼈觉得它相对很简单,主要⽅法如下
Read //读取long型的数据
Increment //使long数据加1
Decrement  //使long数据减1
⼤家需要注意⼀点的就是这个类的所有⽅法都是使⽤的ref型的参数,所以我们在使⽤的时候必须要添加成员变量。下⾯是我写的⼀个线程同步的⼩例⼦,道理很简单,希望⼤家能慢慢揣摩。
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
//⽤Interlocked同步线程来演⽰妈妈做菜,孩⼦在旁边偷吃第⼏盘菜
private static long num;
static void Main(string[] args)
{
Thread tt = new Thread(delegate()
{
for (int i = 1; i < 10; i++)
{
//判断变量是否等于1,如果等于1,则线程将会阻塞
//也就是说会执⾏其他的线程
while (Interlocked.Read(ref num) == 1)
{
Thread.Sleep(10);
}
Console.WriteLine("妈妈已经做好第{0}道菜了", i);
Interlocked.Increment(ref num);
}
});
Thread bb = new Thread(delegate()
{
for (int i = 1; i < 10; i++)
{
while (Interlocked.Read(ref num) == 0)
{
Thread.Sleep(10);
}
Console.WriteLine("我正在偷吃第{0}道菜",i);
Interlocked.Decrement(ref num);
}
});
tt.Start();
bb.Start();
Console.Read();
}
}
}
程序运⾏结果如下
下⾯我继续讲解使⽤Monitor类怎么同步这个例⼦,代码如下using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
//⽤Monitor同步线程来演⽰妈妈做菜,孩⼦在旁边偷吃第⼏盘菜//obj并⾮必须要⽤Static关键字,只是因为这是在main控制台⾥private static object obj = new object();
static void Main(string[] args)
{
Thread tt = new Thread(delegate()
{
for (int i = 1; i < 10; i++)
{
try

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。