线程的控制和线程池

一.WaitHandle:

    ”.Net 中提供了一些线程间更自由通讯的工具,他们提供了通过"信号"进行通讯的机制

可以通过ManualResetEvent,AutoResetEvent(他是在开门并且一个 WaitOne 通过后自动关门)来进行线程间的通讯

    • waitOne:    等待开门
    • Set:           开门
    • Reset:       关门
static void Main(string[] args)
{
    ManualResetEvent mre = new ManualResetEvent(false);//构造函数 false 表示“初始状态为关门”,设置为 true 则初始化为开门状态
    Thread thread = new Thread(() =>
    {
        Console.WriteLine("开始等着开门");
        mre.WaitOne();           //这里程序就等着开门
        Console.WriteLine("终于开门了");
    });
    thread.Start();
    Console.WriteLine("按任意键开门");
    Console.ReadKey();
    mre.Set();//开门
    Console.ReadKey();
}

    mre.WaitOne(5000)                           //还可以设置等待超时时间:返回true或false

    WaitHandle.WaitAll(WaitHandle[] waitHandles)            //用来等待所有信号都变为“开门状态”

    WaitHandle.WaitAny(WaitHandle[] waitHandles)                //用来等待任意一个信号都变为“开门状态”

二.线程池:

    每次创建线程、销毁线程都比较消耗 cpu 资源,因此可以通过线程池进行优化。线程池是一组已经创建好的线程,随用随取,用完了不是销毁线程,然后放到线程池中,供其他人用

  ThreadPool 类的一个重要方法:

    static bool QueueUserWorkItem(WaitCallback callBack, object state)      //第二个重载是用来传递一个参数给线程代码的

 1 static void Main(string[] args)
 2 {
 3     for (int i = 0; i < 20; i++)
 4     {
 5         ThreadPool.QueueUserWorkItem(obj => {
 6             Console.WriteLine("i="+obj);
 7                 
 8         },i);
 9     }
10     for (int i = 0; i < 20; i++)
11     {
12         Console.WriteLine("hello");
13     }
14     Console.ReadKey();
15 }
线程池的使用

 

posted on 2017-09-20 11:14  风雪幻林  阅读(511)  评论(0编辑  收藏  举报