CountDownLatch CyclicBarrier和 Semaphore

 

CountDownLatch:

计数器,某个线程等待N个线程执行完毕后再继续执行,N就是对应的计数,每个执行完毕就减一,直到所有完成。可以看作是1个等多个。
常用方法:
public CountDownLatch(int count) {  };
public void await() throws InterruptedException { };   //调用await()方法的线程会被挂起,一直等待直到count值为0然后继续执行
public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };  //和await()类似,只不过等待一定的时间timeout后,即使count值还没变为0的话也会继续执行
public void countDown() { };  //将count值减1

CyclicBarrier:

循环计数器,一般是N个线程相互执行等待,所有执行完毕再继续下一步动作。可以看作是n个互相等待。
常用方法:
public CyclicBarrier(int parties, Runnable barrierAction) {}   //barrierAction 回调函数
public CyclicBarrier(int parties) {}
//等待
public int await() throws InterruptedException, BrokenBarrierException { };
//等待一段时间
public int await(long timeout, TimeUnit unit)throws InterruptedException,BrokenBarrierException,TimeoutException { };

Semaphore:

信号量,一般是获取到信号量的执行某个动作,完毕后释放,其他继续获取。类似锁。
常用方法:
public Semaphore(int permits) {          //参数permits表示许可数目,即同时可以允许多少线程进行访问
    sync = new NonfairSync(permits);
}
public Semaphore(int permits, boolean fair) {    //参数fair表示是否是公平的,即等待时间越久的越先获取许可
    sync = (fair)? new FairSync(permits) : new NonfairSync(permits);
}

public void acquire() throws InterruptedException {  }     //获取一个许可
public void acquire(int permits) throws InterruptedException { }    //获取permits个许可
public void release() { }          //释放一个许可,和acquire对应
public void release(int permits) { }    //释放permits个许可
上述acquire方法都是阻塞的,会一直等待,下面则提供了一些非阻塞方法。
public boolean tryAcquire() { };    //尝试获取一个许可,若获取成功,则立即返回true,否则立即返回false
public boolean tryAcquire(long timeout, TimeUnit unit) throws InterruptedException { };  //尝试获取一个许可,若在指定的时间内获取成功,则立即返回true,否则立即返回false
public boolean tryAcquire(int permits) { }; //尝试获取permits个许可,若获取成功,则立即返回true,否则立即返回false
public boolean tryAcquire(int permits, long timeout, TimeUnit unit) throws InterruptedException { }; //尝试获取permits个许可,若在指定的时间内获取成功,则立即返回true,否则立即返回false

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值