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);
    
                }
    
            }
        }
    }

     

  • 相关阅读:
    树的遍历
    字符串转化到实数
    redis笔记_源码_跳表skiplist
    《parsing techniques》中文翻译和正则引擎解析技术入门
    sublime3 Package Control和 中文安装
    python基础——字典dict
    python基础1
    pandas入门总结1
    numpy入门总结2
    numpy入门总结1
  • 原文地址:https://www.cnblogs.com/hnzheng/p/12772346.html
Copyright © 2011-2022 走看看