在开发中经常会遇到线程的例子,如果某个后台操作比较费时间,我们就可以启动一个线程去执行那个费时的操作,同时程序继续执行。在某些情况下可能会出现多个线程的同步协同的问题,下面的例子就展示了在两个线程之间如何协同工作。
这个程序的思路是共同做一件事情(从一个ArrayList中删除元素),如果执行完成了,两个线程都停止执行。
说明:要实现线程同步不止这一种方式。在这里采用了事件,在事件处理程序里中止了线程
[代码] [C#]代码
02 | using System.Collections; |
03 | using System.Collections.Generic; |
04 | using System.Threading; |
07 | /// 在开发中经常会遇到线程的例子,如果某个后台操作比较费时间,我们就可以启动一个线程去执行那个费时的操作,同时程序继续执行。在某些情况下可能会出现多个线程的同步协同的问题,下面的例子就展示了在两个线程之间如何协同工作。 |
09 | ///这个程序的思路是共同做一件事情(从一个ArrayList中删除元素),如果执行完成了,两个线程都停止执行。 |
12 | /// 原发地址:http://blog.youkuaiyun.com/zhoufoxcn |
14 | public class ThreadDemo |
16 | private Thread threadOne; |
17 | private Thread threadTwo; |
18 | private ArrayList stringList; |
19 | private event EventHandler OnNumberClear; |
20 | public static void Main() |
22 | ThreadDemo demo = new ThreadDemo(1000); |
25 | public ThreadDemo( int number) |
27 | Random random = new Random(1000000); |
28 | stringList = new ArrayList(number); |
29 | for ( int i = 0; i < number; i++) |
31 | stringList.Add(random.Next().ToString()); |
33 | threadOne = new Thread( new ThreadStart(Run)); |
34 | threadTwo = new Thread( new ThreadStart(Run)); |
35 | threadOne.Name = "线程1" ; |
36 | threadTwo.Name = "线程2" ; |
37 | OnNumberClear += new EventHandler(ThreadDemo_OnNumberClear); |
53 | string stringValue = null ; |
57 | stringValue = ( string )stringList[0]; |
58 | Console.WriteLine(Thread.CurrentThread.Name + "删除了" + stringValue); |
59 | stringList.RemoveAt(0); |
60 | if (stringList.Count == 0) |
62 | OnNumberClear( this , new EventArgs()); |
70 | void ThreadDemo_OnNumberClear( object sender, EventArgs e) |
72 | Console.WriteLine( "执行完了,停止了所有线程的执行。" ); |