多线程一

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading;

namespace ThreadTest
{
    class ThreadTest
    {
        public object locker = new object();
        int count = 100;
        public void Sell()
        {
            //Console.WriteLine("当前进入的线程:" + System.Threading.Thread.CurrentThread.Name);
            while (count > 0)
            {
                lock (locker)//不同线程执行这个代码时只要确保是同一个对象就可以了,如: this.GetType()  /  static变量 / 相同实例变量
                {
                    count--;
                    Console.WriteLine(System.Threading.Thread.CurrentThread.Name + ",剩{0}张~!", count);
                }
            }
        }

        #region 1.0测试 实例方法里的锁
        /// <summary>
        /// 1.0测试 实例方法里的锁
        /// </summary>
        /// <param name="oLoker"></param>
        public void TestSellMany()
        {
            ThreadTest tt = new ThreadTest();
            Thread t1 = new Thread(tt.Sell);
            t1.Name = "t1";
            t1.IsBackground = true;

            Thread t2 = new Thread(tt.Sell);
            t2.Name = "t2";
            t2.IsBackground = true;

            t1.Start();
            t2.Start();
        } 
        #endregion
        //----------------------------------------------------------------

        static int countStatic = 100;
        public static object lockerStatic = new object();
        public static void SellStatic(object oLoker)
        {
            while (countStatic > 0)
            {
                lock (oLoker)//不同线程执行这个代码时只要确保是同一个对象就可以了,如: this.GetType()  /  static变量 / 相同实例变量
                {
                    countStatic--;
                    Console.WriteLine(System.Threading.Thread.CurrentThread.Name + ",剩{0}张~!", countStatic);
                }
            }
        }

        #region 2.0 测试 静态方法里的锁
        /// <summary>
        /// 测试 静态方法里的锁
        /// </summary>
        public void TestSellManyStatic()
        {
            ThreadTest tt = new ThreadTest();
            Thread t1 = new Thread(SellStatic);
            t1.Name = "t1";
            t1.IsBackground = true;

            Thread t2 = new Thread(SellStatic);
            t2.Name = "t2";
            t2.IsBackground = true;

            object lok = new object();
            t1.Start(lok);
            t2.Start(lok);
        } 
        #endregion
        //----------------------------------------------------------------
        public void SellByMonitor()
        {
            while (countStatic > 0)
            {
                bool isGetLoker = false;
                try
                {
                    Monitor.Enter(locker, ref isGetLoker);//尝试获取锁,如果获取成功,isGetLoker=true,否则=false
                    countStatic--;
                    Console.WriteLine(System.Threading.Thread.CurrentThread.Name + ",剩{0}张~!", countStatic);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    if (isGetLoker)//如果有锁,就解锁;否则,没有锁,就不存在 解锁!
                    {
                        Monitor.Exit(locker);
                    }
                }
            }
        }
        #region 3.0 测试 Monitor
        /// <summary>
        /// 3.0 测试 Monitor
        /// </summary>
        public static void TestMonitor()
        {
            ThreadTest tt = new ThreadTest();
            Thread t1 = new Thread(tt.SellByMonitor);
            t1.Name = "t1";
            t1.IsBackground = true;

            Thread t2 = new Thread(tt.SellByMonitor);
            t2.Name = "t2";
            t2.IsBackground = true;

            t1.Start();
            t2.Start();
        } 
        #endregion

        int forNum = 0;
        public void PrintNum(int num)
        {
            Console.WriteLine(System.Threading.Thread.CurrentThread.Name+",哈哈哈~~~");
            Console.WriteLine(num);
        }

        //同步方法 特性
        [MethodImpl(MethodImplOptions.Synchronized)]
        public void MethodLock()
        {
            for (; forNum < 100; forNum++)
            {
                PrintNum(forNum);
            }
        }

        #region 4.0 测试同步方法
        //测试同步方法
        public static void TestMothodLock()
        {
            ThreadTest tt = new ThreadTest();
            Thread t1 = new Thread(tt.MethodLock);
            t1.Name = "t1";
            t1.IsBackground = true;

            Thread t2 = new Thread(tt.MethodLock);
            t2.Name = "t2";
            t2.IsBackground = true;

            t1.Start();
            t2.Start();
        } 
        #endregion
        //-------------------------------------------------------------------------
        static object locker1 = new object();
        static object locker2 = new object();

        #region 5.0测试死锁
        //5.0测试死锁
        public static void TestDeadLock()
        {
            new Thread(() =>
            {
                Console.WriteLine("线程1开始执行");
                lock (locker1)   //获取锁locker1
                {
                    Console.WriteLine("线程1获取锁1");
                    Thread.Sleep(1000);
                    lock (locker2) //尝试获取locker2
                    {
                        Console.WriteLine("线程1获取锁2");
                    }
                }
            }).Start();

            new Thread(() =>
            {
                Console.WriteLine("线程2开始执行");
                lock (locker2) //获取锁locker2
                {
                    Console.WriteLine("线程2获取锁2");
                    Thread.Sleep(1000);
                    lock (locker1) //尝试获取locker1
                    {
                        Console.WriteLine("线程2获取锁1");
                    }
                }
            }).Start();
        } 
        #endregion
        //-------------------------------------------------------------------------
        #region 6.0 测试 线程通信
        /// <summary>
        /// 6.0 测试 线程通信
        /// </summary>
        public static void TestProCus()
        {
            Dog d = new Dog();
            Productor p = new Productor(d);
            Customer c = new Customer(d);

            Thread trhPro = new Thread(p.ProductDog);
            trhPro.IsBackground = true;
            trhPro.Name = "t1";

            Thread trhCus = new Thread(c.ShowDogInfo);
            trhCus.IsBackground = true;
            trhCus.Name = "t2";

            trhPro.Start();
            trhCus.Start();
            Console.ReadLine();
            trhPro.Abort();
            trhCus.Abort();
        } 
        #endregion
        //-------------------------------------------------------------------------

        public static void Mother()
        {
            Console.WriteLine("买菜~~~");
            Console.WriteLine("切菜~~~");
            Console.WriteLine("做菜~~~");
            Console.WriteLine("做饭~~~判断是否有米,发现木有米勒,就叫儿子去买米......");
            Thread thrSon = new Thread(Son);
            thrSon.IsBackground = true;
            thrSon.Start();
            thrSon.Join();//强制阻断其他线程执行,先执行当前线程thrSon
            Console.WriteLine("儿子买米回来了~~~");
            Console.WriteLine("淘米~~~");
            Console.WriteLine("煮饭~~~");
            Console.WriteLine("吃饭~~~");
        }

        public static void Son()
        {
            Console.WriteLine("妈妈叫我去买米~~~");
            Console.WriteLine("买米哦~~~");
            for (int i = 0; i < 5; i++) 
            {
                System.Threading.Thread.Sleep(500);
                Console.WriteLine("{0}秒钟......",i);
            }
            Console.WriteLine("买好米勒,回家~~~!");
        }

        public static void TestJoin()
        {
            Thread thrMother = new Thread(Mother);
            thrMother.IsBackground = true;
            thrMother.Start();
        }

        public static void Main(string[] ar)
        {
            //TicketSeller t1 = new TicketSeller("1台");
            //TicketSeller t2 = new TicketSeller("2台");
            TestJoin();
            Console.ReadLine();
        }

    }

    /// <summary>
    /// 产品
    /// </summary>
    public class Dog
    {
        public static object lockCommunicate = new object();

        public string name;
        public int age;
    }

    /// <summary>
    /// 生产者
    /// </summary>
    public class Productor
    {
        Dog myDog;
        public Productor(Dog d)
        {
            myDog = d;
        }

        bool type = true;
        public void ProductDog()
        {
            while (true)
            {
                lock (Dog.lockCommunicate)
                {
                    if (type)
                    {
                        myDog.name = "Ruiky";
                        myDog.age = 2;
                    }
                    else
                    {
                        myDog.name = "瑞奇";
                        myDog.age = 1;
                    }
                    type = !type;
                    Monitor.Pulse(Dog.lockCommunicate);
                    Monitor.Wait(Dog.lockCommunicate);
                }
            }
        }
    }

    public class Customer
    {
        Dog myDog;
        public Customer(Dog d)
        {
            myDog = d;
        }

        public void ShowDogInfo()
        {
            while (true)
            {
                lock (Dog.lockCommunicate)
                {
                    Console.WriteLine("我是{0},年龄{1}", myDog.name, myDog.age);
                    Monitor.Pulse(Dog.lockCommunicate);
                    Monitor.PulseAll(Dog.lockCommunicate);
                    Monitor.Wait(Dog.lockCommunicate);
                }
            }
        }
    }

    public class TicketSeller
    {
        public static int count = 100;
        public static object locker = new object();

        public TicketSeller(string taiName)
        {
            Thread t2 = new Thread(Sell);
            t2.Name = taiName;// "2号台";
            t2.IsBackground = true;
            t2.Start();
        }

        public void Sell()
        {
            while (count > 0)
            {
                lock (this)
                {
                    TicketSeller.count--;
                    Console.WriteLine(System.Threading.Thread.CurrentThread.Name + ",剩{0}张~!", count);
                }
            }
        }

        public void Sell2()
        {
            lock (locker)
            {
 
            }
        }
    }
}

 

posted @ 2014-11-18 21:06  编程猴子  阅读(156)  评论(0编辑  收藏  举报