Semaphore
介绍
Semaphore 信号量,用来控制同一时间,资源可被访问的线程数量,一般可用于流量的控制。其内部是基于AQS的共享模式,AQS的状态表示许可证的数量,在许可证数量不够时,线程将会被挂起;而一旦有一个线程释放一个资源,那么就有可能重新唤醒等待队列中的线程继续执行。
构造方法
public Semaphore(int permits) {
sync = new NonfairSync(permits);
}
public Semaphore(int permits, boolean fair) {
sync = fair ? new FairSync(permits) : new NonfairSync(permits);
}
使用示例
|
public class SemaphoreTest { static class Parking { //信号量 private Semaphore semaphore;
Parking(int count) { semaphore = new Semaphore(count); }
public void park() { try { //获取信号量 semaphore.acquire(); long time = (long) (Math.random() * 10000); System.out.println(Thread.currentThread().getName() + "进入停车场,停车" + time + "秒..."); Thread.sleep(time); System.out.println(Thread.currentThread().getName() + "开出停车场..."); } catch (InterruptedException e) { e.printStackTrace(); } finally { semaphore.release(); } } }
static class Car extends Thread { Parking parking;
Car(Parking parking) { this.parking = parking; }
@Override public void run() { parking.park(); //进入停车场 } }
public static void main(String[] args) { Parking parking = new Parking(3); for (int i = 0; i < 5; i++) { new Car(parking).start(); } } } Thread-0进入停车场,停车8243秒... Thread-2进入停车场,停车7086秒... Thread-4进入停车场,停车696秒... Thread-4开出停车场... Thread-3进入停车场,停车1007秒... Thread-3开出停车场... Thread-1进入停车场,停车1972秒... Thread-1开出停车场... Thread-2开出停车场... Thread-0开出停车场... |