using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace BarrierDemo
{
class Program
{
static void Main(string[] args)
{
var t1 = new Thread(() => PlayGame("the player", "on line", 5));
var t2 = new Thread(() => PlayGame("the game", "opening", 2));
t1.Start();
t2.Start();
Console.ReadKey();
}static Barrier _barrier = new Barrier(2, b => Console.WriteLine($"End of phase{b.CurrentPhaseNumber + 1}"));
static void PlayGame(string name, string message, int seconds)
{
for(int i = 1;
i < 3;
i++)
{
Console.WriteLine("---------------------------------------------");
Thread.Sleep(TimeSpan.FromSeconds(seconds));
Console.WriteLine($"{name} starts to {message}");
Thread.Sleep(TimeSpan.FromSeconds(seconds));
Console.WriteLine($"{name} finishes to {message}");
_barrier.SignalAndWait();
}
}
}
}
【Barrier类的使用,可作为多线程间的信号量】当设定了_barrier实例中参与线程的数量,其中任何一个线程发出了信号_barrier.SignalAndWait()并开始等待,直到剩下的所有线程都发出信号,才开始往下走。可以理解为:一辆车在等人,人齐了就走,人不齐就所有人都等着。
推荐阅读
- 代码狂魔|实战证明java中的两把锁ReentrantLock与synchronized的系统调用
- 进程通信方式
- 解决方案|大文件拆分方案的java实践
- 多线程编程(1)(共享内存与锁)
- Java|多线程编程(二)——面试题,每个线程只打印一种字符,多个线程协同顺序打印n次字符串(求大神的其他实现方案)
- 一道面试题(多个线程按顺序输出)
- 多线程|java多线程实现奇偶数输出
- 面试题--三个线程循环打印ABC 10次(另类解决方法)
- 用信号量(互斥锁)实现两个线程交替打印