Semaphore用于对多个线程进行限流。synchronized关键字每次只能允许一个线程访问锁对象,而Semaphore可以设置允许一个或多个线程访问锁定内容。
(1)构造方法
- Semaphore(int permits)
创建具有给定的许可数和非公平的公平设置的Semaphore。 - Semaphore(int permits, boolean fair)
创建具有给定的许可数和给定的公平设置的 Semaphore。
(2)成员方法 - void acquire()
从此信号量获取一个许可,如果没有得到许可线程阻塞,或者线程已被中断。 - void acquire(int permits)
从此信号量获取给定数目的许可,如果没有得到许可线程阻塞,或者线程已被中断。 - void acquireUninterruptibly()
从此信号量中获取许可,在有可用的许可前将其阻塞,线程不会被中断。 - void acquireUninterruptibly(int permits)
从此信号量获取给定数目的许可,在提供这些许可前一直将线程阻塞,线程不会被中断。 - boolean tryAcquire()
仅在调用时此信号量存在一个可用许可,才从信号量获取许可。 - boolean tryAcquire(int permits)
仅在调用时此信号量中有给定数目的许可时,才从此信号量中获取这些许可。 - boolean tryAcquire(int permits, long timeout, TimeUnit unit)
如果在给定的等待时间内此信号量有可用的所有许可,并且当前线程未被中断,则从此信号量获取给定数目的许可
public class ContainerTest3 {
public static void main(String[] args) {
final Semaphore sph=new Semaphore(6);
for(int i=0;i<8;i++){
new Thread(new Runnable(){
public void run(){
try {
sph.acquire(2);
System.out.println(Thread.currentThread().getName()+"获得权限了");
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
System.out.println(Thread.currentThread().getName()+"释放权限了");
sph.release(2);
}
}
}).start();
}
}
}