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 }
输出结果: