C#简单线程同步例子

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 主线程继续执行剩余语句。此流程完毕。

 

例子:

 1 function 主线程方法()
 2 {
 3     输出("主线程_步骤1_准备执行子线程");
 4 
 5     Thread 子线程1 = new Thread(子线程方法1);
 6     Thread 子线程2 = new Thread(子线程方法2);
 7     
 8     子线程1.Start();
 9     子线程2.Start();
10 
11     输出("主线程_步骤2_等待【子线程1】");
12     子线程1.Join();
13     //1.等待【子线程1】运行完毕,也就是等【子线程1】从【子线程方法1】里return出来。
14     //2.如果【子线程1】没执行结束,也就是【子线程1】仍然在执行【子线程方法1】里的代码,则主线程会一直阻塞(等待)在这里。
15     //3.如果运行这个语句之前,【子线程1】已经运行结束(从【子线程方法1】里return出来),则这个语句会立即运行完成,并且不会产生任何异常或错误。
16     输出("主线程_步骤3_【子线程1】已经退出");
17 
18     输出("主线程_步骤4_等待【子线程2】");
19     子线程2.Join();
20     输出("主线程_步骤5_【子线程2】已经退出");
21 
22     输出("主线程_步骤6_运行完毕");
23 }
24 
25 function 子线程方法1()
26 {
27     休息(1秒);//Thread.Sleep(1000)
28     输出("子线程1_步骤1_开始运行");
29     休息(1秒);
30     休息(1秒);
31     休息(1秒);
32     休息(1秒);
33     休息(1秒);
34     输出("子线程1_步骤1_运行完毕");
35 }
36 
37 function 子线程方法2()
38 {
39     休息(1秒);
40     休息(1秒);
41     输出("子线程2_步骤1_开始运行");
42     休息(1秒);
43     输出("子线程2_步骤1_运行完毕");
44 }
45 
46 程序运行结果:
47 输出:主线程_步骤1_准备执行子线程
48 输出:主线程_步骤2_等待【子线程1】
49 
50 输出:子线程1_步骤1_开始运行
51 输出:子线程2_步骤1_开始运行
52 输出:子线程2_步骤1_运行完毕
53 输出:子线程1_步骤1_运行完毕
54 
55 输出:主线程_步骤3_【子线程1】已经退出
56 输出:主线程_步骤4_等待【子线程2】
57 输出:主线程_步骤5_【子线程2】已经退出
58 
59 输出:主线程_步骤6_运行完毕

 

 

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

 1 private static AutoResetEvent ThreadEvent = new AutoResetEvent(false);//子线程必须等待主线程发出事件后,才能执行
 2 
 3  
 4 
 5 private static void MainThread()
 6 
 7 {
 8 
 9     Thread newThread = new Thread(Program.NewThreadFunction);
10     Console.WriteLine("Main Thread :Start new thread");
11 
12     newThread.Start();
13 
14     Thread.Sleep(5000);//休息5秒
15 
16     Console.WriteLine("Main Thread :Allow new thread continue");
17 
18     ThreadEvent.Set();//允许子线程继续运行
19 
20     Console.ReadKey(true);
21 
22 }
23 
24  
25 
26 private static void NewThread()
27 
28 {
29 
30     Console.WriteLine("New Thread :Start, Wait for Main Thread event");
31 
32     ThreadEvent.WaitOne();//如果主线程不执行ThreadEvent.Set();则子线程会一直阻塞(卡)在这里
33 
34     Console.WriteLine("New Thread :Continue");
35 
36 }
37 
38 运行结果:
39 
40 输出:Main Thread :Start new thread
41 
42 输出:New Thread :Start, Wait for Main Thread event
43 
44 输出:Main Thread :Allow new thread continue
45 
46 输出:New Thread :Continue

 

posted on 2013-03-15 19:47  xxxteam  阅读(398)  评论(0编辑  收藏  举报

导航