Barrier 组织多个线程及时在某个时刻碰面

任意一个线程调用了 _barrier.SignalAndWait() 方法后,会执行一个回调函数来打印出阶段。

 1 /// <summary>
 2         /// 实例 Barrier 类
 3         /// </summary>
 4         public static Barrier _barrier = new Barrier(2, b => Console.WriteLine($"第 {b.CurrentPhaseNumber + 1} 阶段结束"));
 5 
 6         /// <summary>
 7         /// 向 Barrier 发送信号
 8         /// </summary>
 9         /// <param name="name"></param>
10         /// <param name="message"></param>
11         /// <param name="seconds"></param>
12         public static void PlayMusic(string name, string message, int seconds)
13         {
14             for (int i = 1; i < 3; i++)
15             {
16                 Console.WriteLine("------------------------");
17 
18                 System.Threading.Thread.Sleep(TimeSpan.FromSeconds(seconds));
19                 Console.WriteLine($"{name} 开始 {message}");
20 
21                 System.Threading.Thread.Sleep(TimeSpan.FromSeconds(seconds));
22                 Console.WriteLine($"{name} 结束 {message}");
23 
24                 // 回调函数 打印出阶段
25                 _barrier.SignalAndWait();
26             }
27         }

 

每个线程将向 Barrier 发送两次信号,所以会有两个阶段,可以在每个迭代结束前执行一些计算。当最后一个线程调用 SignalAndWait方法时可以在迭代结束时进行交互。

 1 /// <summary>
 2         /// 执行
 3         /// </summary>
 4         public static void Implement()
 5         {
 6             var t1 = new System.Threading.Thread(() => PlayMusic("吉他手", "奏曲", 5));
 7 
 8             var t2 = new System.Threading.Thread(() => PlayMusic("歌手", "唱他的歌", 2));
 9 
10             t1.Start();
11             t2.Start();
12         }

 

输出结果:

 

posted @ 2019-09-08 23:29  刺激  阅读(185)  评论(0编辑  收藏  举报