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

     

  • 相关阅读:
    剔除数组中重复对象
    2018湖南省高中数学联赛(A)试题
    向量与三角
    阿波罗尼斯圆
    2019高考理科数学(天津卷)
    转载Android常见错误(http://www.cnblogs.com/oklanyan/archive/2011/10/12/2208378.html)
    TCP/IP网络层谜云
    bitmap 设置图片尺寸,避免 内存溢出 OutOfMemoryError的优化方法(转载:http://tonyyu.iteye.com/blog/713256)
    ArcGIS for Android 离线数据编辑原理
    Android环境搭建(XP/Win7)转载http://www.cnblogs.com/oklanyan/archive/2011/10/14/2207339.html
  • 原文地址:https://www.cnblogs.com/hnzheng/p/12772346.html
Copyright © 2011-2022 走看看