多线程一
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) { } } } }