java 信号量 countdown_利用信号量模拟CountDownLatch

CountDownLatch

CountDownLatch是一个同步工具类,用来协调多个线程之间的同步

CountDownLatch能够使一个线程等待另一些线程完成各自任务之后,再执行。

CountDownLatch实现

这个地方mutexLock是一个用信号量构造的互斥锁,主要是保护共享变量的。详见 利用信号量来实现读写锁

构造函数接受一个整数。是一个计数器。

这个latch设置信号量的初始值是0。这样当A线程运行await函数时,他就会立即阻塞。

当其他线程运行down函数(相对于CountDownLatch中的countdown函数)count就减减,直到count等于0时。表明所有线程执行完毕。就释放锁。唤醒A线程。

public class MyCountDownLatch {

private Semaphore latch = new Semaphore(0);

private MutexLock mutex = new MutexLock();

private int count;

MyCountDownLatch(int i){

count = i;

}

public void await() throws InterruptedException{

latch.acquire();

}

public void down() throws InterruptedException {

mutex.lock();

count--;

if(count == 0){

latch.release();

}

mutex.unlock();

}

}

测试代码

public class Main {

public static void main(String[] args){

new Main().test();

}

private void test(){

int num = 5;

MyCountDownLatch latch = new MyCountDownLatch(num);

for(Integer i = 0; i < num; i++){

new MyThread(latch,i.toString()).start();

}

try {

latch.await();

}catch (Exception e){

}

System.out.println("all done");

}

class MyThread extends Thread{

private MyCountDownLatch latch;

public MyThread(MyCountDownLatch l,String name){

latch = l;

this.setName(name);

}

public void run(){

try{

System.out.println(this.getName() + " is running");

Thread.sleep((int)(Math.random() * 5000));

System.out.println(this.getName() + " done");

latch.down();

}catch (Exception e){

}

}

}

}

测试的结果

0 is running

3 is running

1 is running

2 is running

4 is running

2 done

0 done

1 done

4 done

3 done

all done

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值