在开发中经常会遇到线程的例子,如果某个后台操作比较费时间,我们就可以启动一个线程去执行那个费时的操作,同时程序继续执行。在某些情况下可能会出现多个线程的同步协同的问题,下面的例子就展示了在两个线程之间如何协同工作。
这个程序的思路是共同做一件事情(从一个ArrayList中删除元素),如果执行完成了,两个线程都停止执行。
说明:要实现线程同步不止这一种方式。在这里采用了事件,在事件处理程序里中止了线程
[代码] [C#]代码
02 |
using System.Collections; |
03 |
using System.Collections.Generic; |
04 |
using System.Threading; |
07 |
/// 在开发中经常会遇到线程的例子,如果某个后台操作比较费时间,我们就可以启动一个线程去执行那个费时的操作,同时程序继续执行。在某些情况下可能会出现多个线程的同步协同的问题,下面的例子就展示了在两个线程之间如何协同工作。 |
09 |
///这个程序的思路是共同做一件事情(从一个ArrayList中删除元素),如果执行完成了,两个线程都停止执行。 |
12 |
/// 原发地址:http://blog.csdn.net/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( "执行完了,停止了所有线程的执行。" ); |