通过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         }

 

 

 

posted @ 2020-03-29 13:21  paulscholes007  阅读(394)  评论(1)    收藏  举报