??public class MonitorSample ??{ public static void Main(String[] args) { ??int result = 0; file://一个标志位,如果是0表示程序没有出错,如果是1表明有错误发生 ??Cell cell = new Cell( ); ??//下面使用cell初始化CellProd和CellCons两个类,生产和消费次数均为20次 ??CellProd prod = new CellProd(cell, 20); ??CellCons cons = new CellCons(cell, 20); ??Thread producer = new Thread(new ThreadStart(prod.ThreadRun)); ??Thread consumer = new Thread(new ThreadStart(cons.ThreadRun)); ??//生产者线程和消费者线程都已经被创建,但是没有开始执行 ??try ??{ producer.Start( ); consumer.Start( ); producer.Join( ); consumer.Join( ); Console.ReadLine(); ??} ??catch (ThreadStateException e) ??{ file://当线程因为所处状态的原因而不能执行被请求的操作 Console.WriteLine(e); result = 1; ??} ??catch (ThreadInterruptedException e) ??{ file://当线程在等待状态的时候中止 Console.WriteLine(e); result = 1; ??} ??//尽管Main()函数没有返回值,但下面这条语句可以向父进程返回执行结果 ??Environment.ExitCode = result; } ??} |
??Produce: 1 ??Consume: 1 ??Produce: 2 ??Consume: 2 ??Produce: 3 ??Consume: 3 ??... ??... ??Produce: 20 ??Consume: 20 |
??using System; ??using System.Collections; ??using System.Threading; ??//这是用来保存信息的数据结构,将作为参数被传递 ??public class SomeState ??{ public int Cookie; public SomeState(int iCookie) { ??Cookie = iCookie; } ??} ??public class Alpha ??{ public Hashtable HashCount; public ManualResetEvent eventX; public static int iCount = 0; public static int iMaxCount = 0; public Alpha(int MaxCount) { ??HashCount = new Hashtable(MaxCount); ??iMaxCount = MaxCount; } file://线程池里的线程将调用Beta()方法 public void Beta(Object state) { ??//输出当前线程的hash编码值和Cookie的值 ??Console.WriteLine(" {0} {1} :", Thread.CurrentThread.GetHashCode(), ??((SomeState)state).Cookie); ??Console.WriteLine("HashCount.Count=={0}, Thread.CurrentThread.GetHashCode()=={1}", HashCount.Count, Thread.CurrentThread.GetHashCode()); ??lock (HashCount) ??{ file://如果当前的Hash表中没有当前线程的Hash值,则添加之 if (!HashCount.ContainsKey(Thread.CurrentThread.GetHashCode())) ??HashCount.Add (Thread.CurrentThread.GetHashCode(), 0); HashCount[Thread.CurrentThread.GetHashCode()] = ((int)HashCount[Thread.CurrentThread.GetHashCode()])+1; ??} ??int iX = 2000; ??Thread.Sleep(iX); ??//Interlocked.Increment()操作是一个原子操作,具体请看下面说明 ??Interlocked.Increment(ref iCount); ??if (iCount == iMaxCount) ??{ Console.WriteLine(); Console.WriteLine("Setting eventX "); eventX.Set(); ??} } ??} ??public class SimplePool ??{ public static int Main(string[] args) { ??Console.WriteLine("Thread Pool Sample:"); ??bool W2K = false; ??int MaxCount = 10;//允许线程池中运行最多10个线程 ??//新建ManualResetEvent对象并且初始化为无信号状态 ??ManualResetEvent eventX = new ManualResetEvent(false); ??Console.WriteLine("Queuing {0} items to Thread Pool", MaxCount); ??Alpha oAlpha = new Alpha(MaxCount); file://创建工作项 ??//注意初始化oAlpha对象的eventX属性 ??oAlpha.eventX = eventX; ??Console.WriteLine("Queue to Thread Pool 0"); ??try ??{ file://将工作项装入线程池 file://这里要用到Windows 2000以上版本才有的API,所以可能出现NotSupportException异常 ThreadPool.QueueUserWorkItem(new WaitCallback(oAlpha.Beta), new SomeState(0)); W2K = true; ??} ??catch (NotSupportedException) ??{ Console.WriteLine("These API@#s may fail when called on a non-Windows 2000 system."); W2K = false; ??} ??if (W2K)//如果当前系统支持ThreadPool的方法. ??{ for (int iItem=1;iItem < MaxCount;iItem++) { ??//插入队列元素 ??Console.WriteLine("Queue to Thread Pool {0}", iItem); ??ThreadPool.QueueUserWorkItem(new WaitCallback(oAlpha.Beta),new SomeState(iItem)); } Console.WriteLine("Waiting for Thread Pool to drain"); file://等待事件的完成,即线程调用ManualResetEvent.Set()方法 eventX.WaitOne(Timeout.Infinite,true); file://WaitOne()方法使调用它的线程等待直到eventX.Set()方法被调用 Console.WriteLine("Thread Pool has been drained (Event fired)"); Console.WriteLine(); Console.WriteLine("Load across threads"); foreach(object o in oAlpha.HashCount.Keys) Console.WriteLine("{0} {1}", o, oAlpha.HashCount[o]); ??} ??Console.ReadLine(); ??return 0; } ??} |
??Thread Pool Sample: ??Queuing 10 items to Thread Pool ??Queue to Thread Pool 0 ??Queue to Thread Pool 1 ??... ??... ??Queue to Thread Pool 9 ??Waiting for Thread Pool to drain ??98 0 : ??HashCount.Count==0, Thread.CurrentThread.GetHashCode()==98 ??100 1 : ??HashCount.Count==1, Thread.CurrentThread.GetHashCode()==100 ??98 2 : ??... ??... ??Setting eventX ??Thread Pool has been drained (Event fired) ??Load across threads ??101 2 ??100 3 ??98 4 ??102 1 |
??Timer timer = new Timer(timerDelegate, s,1000, 1000); |
?? public bool Change(long, long); |
?? timer.Change(10000,2000); |
??using System; ??using System.Threading; ??class TimerExampleState ??{ public int counter = 0; public Timer tmr; ??} ??class App ??{ public static void Main() { ??TimerExampleState s = new TimerExampleState(); ??//创建代理对象TimerCallback,该代理将被定时调用 ??TimerCallback timerDelegate = new TimerCallback(CheckStatus); ??//创建一个时间间隔为1s的定时器 ??Timer timer = new Timer(timerDelegate, s,1000, 1000); ??s.tmr = timer; ??//主线程停下来等待Timer对象的终止 ??while(s.tmr != null) Thread.Sleep(0); ??Console.WriteLine("Timer example done."); ??Console.ReadLine(); } file://下面是被定时调用的方法 static void CheckStatus(Object state) { ??TimerExampleState s =(TimerExampleState)state; ??s.counter++; ??Console.WriteLine("{0} Checking Status {1}.",DateTime.Now.TimeOfDay, s.counter); ??if(s.counter == 5) ??{ file://使用Change方法改变了时间间隔 (s.tmr).Change(10000,2000); Console.WriteLine("changed..."); ??} ??if(s.counter == 10) ??{ Console.WriteLine("disposing of timer..."); s.tmr.Dispose(); s.tmr = null; ??} } ??} |