CountDownLatch、CyclicBarrier和Semaphore

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

 

其他可参考:https://www.cnblogs.com/dolphin0520/p/3920397.html
 

你可能感兴趣的:(名词解释)