首页 > 代码库 > 多线程一

多线程一

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

 

多线程一