您的位置:首页 > 编程语言 > C#

C#简单线程同步例子

2013-03-15 19:47 295 查看
1.利用Thread的Join方法,实现1个主线程与多个子线程

1.1 主线程创建一个新线程:Thread newThread = new Thread(...);

1.2 主线程让新线程开始执行:newThread.Start(....);

1.2.1 流程1:此时新线程仍然在执行

1.2.1.1 主线程对新线程执行Join: newThread.Join(); 主线程会阻塞(卡)在这个语句。

1.2.1.2 新线程执行完毕

1.2.1.3 主线程继续执行剩余语句。此流程完毕。

1.2.2 流程2:此时新线程已经执行完毕

1.2.2.1 主线程对新线程执行Join: newThread.Join(); 这个语句会立即执行完毕

1.2.2.2 主线程继续执行剩余语句。此流程完毕。

例子:

function 主线程方法()
{
输出("主线程_步骤1_准备执行子线程");

Thread 子线程1 = new Thread(子线程方法1);
Thread 子线程2 = new Thread(子线程方法2);

子线程1.Start();
子线程2.Start();

输出("主线程_步骤2_等待【子线程1】");
子线程1.Join();
//1.等待【子线程1】运行完毕,也就是等【子线程1】从【子线程方法1】里return出来。
//2.如果【子线程1】没执行结束,也就是【子线程1】仍然在执行【子线程方法1】里的代码,则主线程会一直阻塞(等待)在这里。
//3.如果运行这个语句之前,【子线程1】已经运行结束(从【子线程方法1】里return出来),则这个语句会立即运行完成,并且不会产生任何异常或错误。
输出("主线程_步骤3_【子线程1】已经退出");

输出("主线程_步骤4_等待【子线程2】");
子线程2.Join();
输出("主线程_步骤5_【子线程2】已经退出");

输出("主线程_步骤6_运行完毕");
}

function 子线程方法1()
{
休息(1秒);//Thread.Sleep(1000)
输出("子线程1_步骤1_开始运行");
休息(1秒);
休息(1秒);
休息(1秒);
休息(1秒);
休息(1秒);
输出("子线程1_步骤1_运行完毕");
}

function 子线程方法2()
{
休息(1秒);
休息(1秒);
输出("子线程2_步骤1_开始运行");
休息(1秒);
输出("子线程2_步骤1_运行完毕");
}

程序运行结果:
输出:主线程_步骤1_准备执行子线程
输出:主线程_步骤2_等待【子线程1】

输出:子线程1_步骤1_开始运行
输出:子线程2_步骤1_开始运行
输出:子线程2_步骤1_运行完毕
输出:子线程1_步骤1_运行完毕

输出:主线程_步骤3_【子线程1】已经退出
输出:主线程_步骤4_等待【子线程2】
输出:主线程_步骤5_【子线程2】已经退出

输出:主线程_步骤6_运行完毕


2.利用AutoResetEvent事件通知,实现1个主线程与1个子线程之间的同步

private static AutoResetEvent ThreadEvent = new AutoResetEvent(false);//子线程必须等待主线程发出事件后,才能执行

private static void MainThread()

{

Thread newThread = new Thread(Program.NewThreadFunction);
Console.WriteLine("Main Thread :Start new thread");

newThread.Start();

Thread.Sleep(5000);//休息5秒

Console.WriteLine("Main Thread :Allow new thread continue");

ThreadEvent.Set();//允许子线程继续运行

Console.ReadKey(true);

}

private static void NewThread()

{

Console.WriteLine("New Thread :Start, Wait for Main Thread event");

ThreadEvent.WaitOne();//如果主线程不执行ThreadEvent.Set();则子线程会一直阻塞(卡)在这里

Console.WriteLine("New Thread :Continue");

}

运行结果:

输出:Main Thread :Start new thread

输出:New Thread :Start, Wait for Main Thread event

输出:Main Thread :Allow new thread continue

输出:New Thread :Continue
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: