zoukankan      html  css  js  c++  java
  • 线程间同步

      public class Clock
        {
            private object obj = new object();
    
            public void RunClock(int Minute)
            {
    
                Thread thread1 = new Thread(() =>
                {
                    int sencond = Minute * 60 / 2;
                    while (sencond > 0)
                    {
                        Di(true);
                        sencond--;
                    }
                });
                Thread thread2 = new Thread(() =>
                {
                    int sencond = Minute * 60 / 2;
                    while (sencond > 0)
                    {
                        Da(true);
                        sencond--;
                    }
                });
                Thread thread3 = new Thread(() =>
                {
                    int sencond = Minute * 60 / 2;
                    while (sencond > 0)
                    {
                        Ye(true);
                        sencond--;
                    }
                });
                thread1.Start();
                thread2.Start();
                thread3.Start();
            }
    
            public void Di(bool flag)
            {
                lock (obj)
                {
                    Console.WriteLine("滴");
                    Thread.Sleep(2000);
                    Monitor.Pulse(obj);
                    Monitor.Wait(obj);
                }
            }
            public void Da(bool flag)
            {
                lock (obj)
                {
    
                    Console.WriteLine("嗒");
                    Thread.Sleep(3000);
                    Monitor.Pulse(obj);
                    Monitor.Wait(obj);
                }
            }
            public void Ye(bool flag)
            {
                lock (obj)
                {
                    Console.WriteLine("耶");
                    Thread.Sleep(3000);
                    Monitor.Pulse(obj);
                    Monitor.Wait(obj);
                }
            }
    
     static void Main(string[] args)
            {
                Clock clock = new Clock();
                clock.RunClock(1);
                Console.WriteLine("运行完成");
            }
    

     结果显示是无序的

    在NET多线程开发中,有时候需要多个线程协调工作,完成这个步骤的过程称为“同步”。

    使用同步的主要原因:
    1.多个线程访问同一个共享资源。
    2.多线程写入文件时保证只有一个线程使用文件资源。
    3.由事件引发线程,线程等待事件,需要挂起线程。

    Monitor实现同步比lock复杂点,lock实际上是Monitor的简便方式,lock最终还是编译成Monitor。
    不同处:
    1.Monitor在使用的时候需要手动指定锁和手动释放手。
    2.Monitor比lock多了几个实用的方法

    Wait是让线程暂停,这个方法有个重写,多了一个参数指定暂停的毫秒数。
    Pulse是唤醒线程。

    thread1.Join(); 
    
     Monitor.Enter(obj);
                    while (sencond > 0)
                    {
                        Ye(true);
                        sencond--;
                    }
    Monitor.Exit(obj);
    

     Join 和 (Enter+Exit)的效果相同。但join只是单纯的阻止其他线程,等待此线程。而Monitor更多关心是同步线程时 阻止其他同锁中的线程。

    参考写照的原文:http://www.cnblogs.com/hailan2012/archive/2012/03/20/2408179.html

  • 相关阅读:
    JSP内置对象Session
    jsp 中对jar 包的引用
    Windows下AndroidStudio 中使用Git(AndroidStudio项目于GitHub关联)
    教你怎么使用Github for Windows?
    cannot run program "git.exe":CreateProcess error=2
    如何在Android Studio上使用Github
    怎么在Android studio配置Github账号
    js下读取input中的value值
    jQuery获取多种input值的方法
    Android studio 导入github工程
  • 原文地址:https://www.cnblogs.com/shikyoh/p/2411552.html
Copyright © 2011-2022 走看看