zoukankan      html  css  js  c++  java
  • c# Monitor.wait() 和sleep的区别

    1  区别:

    a 、 moniter 继承的积累为object,sleep 继承 thread 类

    b、moniter.wait(),会阻塞线程,阻塞的同时但会释放锁,再次获得锁的时候,需要monitor.Pulse唤醒

    c、 thread.sleep 是当前的线程休眠,时间到后,自动恢复 继续往下执行

    例如:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace Wait和Sleep
    {
        class Program
        {
    
    
    
            static object locker = new object();
            static Thread thread1 = new Thread(TestTwo);
            static void Main(string[] args)
            {
    
                Thread thread = new Thread(TestWait);
                thread.Start();
                lock (locker)
                {
                    Console.WriteLine($"线程拥有锁");
                    Console.WriteLine($"线程开始休眠");
                    for (int i = 0; i < 3; i++)
                    {
                        Thread.Sleep(1000);
                        Console.WriteLine($"Main{i}");
                    }
                    Console.WriteLine($"线程休眠结束");
                }
                Console.ReadLine();
            }
    
            static void TestWait()
            {
                Console.WriteLine($"TestWait");
    
                //这里会等待locker 释放
                lock (locker)
                {
                    Console.WriteLine($"开始wait");
                    thread1.Start();
                    Console.WriteLine($"开始wait并且释放锁,阻塞当前线程向下执行,直到再一次获取锁");
                    var satus = Monitor.Wait(locker, 2000); //释放对象上的锁并阻止当前线程,直到它重新获取该锁。 如果已用指定的超时时间间隔,则线程进入就绪队列。
                    if (!satus)
                    {
                        Console.WriteLine("超时");
                    }
                    while (satus)
                    {
                        Console.WriteLine($"TestWait已获取锁,继续执行");
                        Console.WriteLine("TestWait通知释放锁");
                        Monitor.Pulse(locker);//
                        Console.WriteLine("TestWait通知完成");
                        break;
                    }
                }
    
    
            }
    
            static void TestTwo()
            {
    
                lock (locker)
                {
                    Console.WriteLine("TestTwo获取锁");
                    for (int i = 0; i < 3; i++)
                    {
                        Thread.Sleep(1000);
                        Console.WriteLine($"TestTwo{i}");
                    }
                    Console.WriteLine("通知下一个线程获取该锁");
                    Monitor.Pulse(locker);
    
                }
    
            }
        }
    }
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace Wait和Sleep
    {
        class Program
        {
    
    
    
            static object locker = new object();
            static Thread thread1 = new Thread(TestTwo);
            static void Main(string[] args)
            {
    
                Thread thread = new Thread(TestWait);
                thread.Start();
                lock (locker)
                {
                    Console.WriteLine($"线程拥有锁");
                    Console.WriteLine($"线程开始休眠");
                    for (int i = 0; i < 3; i++)
                    {
                        Thread.Sleep(1000);
                        Console.WriteLine($"Main{i}");
                    }
                    Console.WriteLine($"线程休眠结束");
                }
                Console.ReadLine();
            }
    
            static void TestWait()
            {
                Console.WriteLine($"TestWait");
    
                //这里会等待locker 释放
                lock (locker)
                {
                    Console.WriteLine($"开始wait");
                    thread1.Start();
                    Console.WriteLine($"开始wait并且释放锁,阻塞当前线程向下执行,直到再一次获取锁");
                    var satus = Monitor.Wait(locker, 2000); //释放对象上的锁并阻止当前线程,直到它重新获取该锁。 如果已用指定的超时时间间隔,则线程进入就绪队列。
                    if (!satus)
                    {
                        Console.WriteLine("超时");
                    }
                    while (satus)
                    {
                        Console.WriteLine($"TestWait已获取锁,继续执行");
                        Console.WriteLine("TestWait通知释放锁");
                        Monitor.Pulse(locker);//
                        Console.WriteLine("TestWait通知完成");
                        break;
                    }
                }
    
    
            }
    
            static void TestTwo()
            {
    
                lock (locker)
                {
                    Console.WriteLine("TestTwo获取锁");
                    for (int i = 0; i < 3; i++)
                    {
                        Thread.Sleep(1000);
                        Console.WriteLine($"TestTwo{i}");
                    }
                    Console.WriteLine("通知下一个线程获取该锁");
                    Monitor.Pulse(locker);
    
                }
    
            }
        }
    }

     

  • 相关阅读:
    Java根据html模板创建 html文件
    java.lang.NumberFormatException: For input string:"filesId"
    使用java开源工具httpClient及jsoup抓取解析网页数据
    JBPM5流程设计器jbpm-designer-2.4.0.Final-tomcat.war的部署没法访问的问题
    MyEclipse8.0 注册码生成代码
    图片转为byte[]、String、图片之间的转换
    java中Xml、json之间的相互转换
    java二维码小试牛刀
    进度条脚本
    如何制作一寸、二寸、六寸照片。以后不用再去照相馆了!!! 转~版本更新
  • 原文地址:https://www.cnblogs.com/hnzheng/p/12772346.html
Copyright © 2011-2022 走看看