zoukankan      html  css  js  c++  java
  • 信号量的使用 ManualResetEvent

    线程的等待时可以用这个,不论是线程池还是线程都可以用这个做等待。

    
    ManualResetEvent md=new ManualResetEvent(false);//这个false 设置线程等待, true 允许线程不待等
    IAsyncResult result= new Action<string>((t) =>
                {
                    Console.WriteLine(t);
                    mre.Set();//允许线程不用继续等待,可以执行下去
                }).BeginInvoke("你好",null,null);
                mre.WaitOne();//主线程被卡在这里,等待信号量变成true(mre.Set()这个方法后就可变为true不用等待)
                Console.WriteLine("你吃饭了么!");
                mre.Reset();//重新设为线程等待
    
                IAsyncResult result01= new Action<string>((t) =>
                {
                    Console.WriteLine(t);
                    mre.Set();//设置线程不用继续等待,可以执行下去
                }).BeginInvoke("还没吃",null,null);
                mre.WaitOne();//又被阻塞了
    			Console.WriteLine("一起吃饭吧!");
    //输出结果
    你好
    你吃饭了么!
    还没吃
    一起吃饭吧!
    
    //线程池中的使用
     mre.Reset();
                ThreadPool.QueueUserWorkItem((t) =>
                {
                    Console.WriteLine("我是从线程池中走出的线程!");
                    mre.Set();
                });
                mre.WaitOne();
    

    当然也可以用循环待等的执行的方式进行线程待等

     while (!result.IsCompleted)
                {
                    Thread.Sleep(500);
                    Console.WriteLine("我在等你回复!");
                    
                }
      Console.WriteLine("我吃了!");
    
  • 相关阅读:
    尾递归
    Appium环境搭建
    虚拟机与主机的相互访问,虚拟机访问外网
    Python
    npm i 安装
    redis过期键删除策略
    Redis的过期策略和内存淘汰机制
    redis的两种持久化方案
    JVM 方法内联
    进程/线程/协程
  • 原文地址:https://www.cnblogs.com/wangSOA/p/9607419.html
Copyright © 2011-2022 走看看