通过3个线程顺序循环打印0~99
效果如图所示:
代码如下:
1 private void button7_Click(object sender, EventArgs e) 2 { 3 Thread t0 = new Thread(PrintNumbersThree0);//打印线程0 4 Thread t1 = new Thread(PrintNumbersThree1);//打印线程1 5 Thread t2 = new Thread(PrintNumbersThree2);//打印线程2 6 7 //先把打印1,2的信号量设置为占用状态 8 semaph0.WaitOne(); 9 semaph1.WaitOne(); 10 11 t0.Start(); 12 t1.Start(); 13 t2.Start(); 14 15 16 } 17 /// <summary> 18 /// 设置三个信号量,分别控制打印余数为0, 1,2的数字 19 /// </summary> 20 public Semaphore semaph = new Semaphore(1, 1);//信号量1 21 public Semaphore semaph0 = new Semaphore(1, 1);//信号量2 22 public Semaphore semaph1 = new Semaphore(1, 1);//信号量3 23 24 public void PrintNumbersThree0() 25 { 26 ///打印余数为0的数字, 27 for (int j = 0; j < 100; j++)//起始值从0开始 28 { 29 if (j % 3 == 0)//遇到0的打印 30 { 31 semaph.WaitOne(); 32 33 Trace.WriteLine("线程0打印:" + j.ToString()); 34 } 35 else if (j % 3 == 1)//遇到余数为1的,释放信号量2 36 { 37 semaph0.Release(); 38 } 39 } 40 } 41 public void PrintNumbersThree1() 42 { 43 44 for (int j = 1; j < 100; j++)//从1开始 45 { 46 if (j % 3 == 1) 47 { 48 semaph0.WaitOne(); 49 50 Trace.WriteLine("线程1打印:" + j.ToString()); 51 } 52 else if (j % 3 == 2) 53 { 54 semaph1.Release(); 55 } 56 } 57 } 58 public void PrintNumbersThree2() 59 { 60 for (int j = 2; j < 100; j++) 61 { 62 if (j % 3 == 2) 63 { 64 semaph1.WaitOne(); 65 66 Trace.WriteLine("线程2打印:" + j.ToString()); 67 } 68 else if (j % 3 == 0) 69 { 70 semaph.Release(); 71 } 72 //else 73 //{ 74 // semaph0.Release(); 75 //} 76 } 77 //} 78 }