JAVA中的CountDownLatch主要解决这样一种场景需求:
在主线程中开启多个线程处理操作,每个子线程完成时间不一样,期望在所有子线程执行完成后再继续主线程的执行。
CountDownLatch简单而实用,这里借鉴其思路实现了一个简单的C#版本。
class CountDownLatch
{
private object lockObj = new Object();
private int counter;
public CountDownLatch(int counter)
{
this.counter = counter;
}
public void Await()
{
lock (lockObj)
{
while (counter > 0)
{
Monitor.Wait(lockObj);
}
}
}
public void CountDown()
{
lock (lockObj)
{
counter--;
Monitor.PulseAll(lockObj);
}
}
}
WasteTime类用来模拟耗时长短不一的操作
class WasteTime
{
private CountDownLatch latch;
public WasteTime(CountDownLatch latch)
{
this.latch = latch;
}
public void DoSth(object state)
{
//模拟耗时操作
System.Threading.Thread.Sleep(new Random().Next(5) * 1000);
//执行完成注意调用CountDown()方法
this.latch.CountDown();
}
}
测试代码
public void test()
{
int threadCount = 100;
CountDownLatch latch = new CountDownLatch(threadCount);
object state = new object();
for (int i = 0; i < threadCount; i++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(new WasteTime(latch).DoSth), state);
}
latch.Await();
//全部线程执行完成, 继续
}