Semaphore
Semaphore字面意思是信号量的意思,它的作用是控制访问特定资源的线程数目。
举例:现在有一个十字路口,有多辆汽车需要进经过这个十字路口,但是我们规定同时只能有两辆汽车经过。其他汽车处于等待状态,只要某一个汽车经过了这个十字路口,其他的汽车才可以经
过,但是同时只能有两个汽车经过。如何限定经过这个十字路口车辆数目呢? 我们就可以使用Semaphore。
Semaphore的常用方法
public Semaphore(int permits) permits 表示许可线程的数量
public void acquire() throws InterruptedException 表示获取许可
public void release() 表示释放许可
案例演示:模拟汽车通过十字路口
实现步骤:
- 创建一个汽车的线程任务类(CarThreadRunnable),在该类中定义一个Semaphore类型的成员变量
- 创建测试类
- 创建线程任务类对象
- 创建5个线程对象,并启动。(5个线程对象,相当于5辆汽车)
CarThreadRunnable类
public class CarThreadRunnable implements Runnable {// 创建一个Semaphore对象,限制只允许2个线程获取到许可证private Semaphore semaphore = new Semaphore(2) ;@Overridepublic void run() { // 这个run只允许2个线程同时执行try {// 获取许可证semaphore.acquire();System.out.println(Thread.currentThread().getName() + "----->>正在经过十字路口");// 模拟车辆经过十字路口所需要的时间Random random = new Random();int nextInt = random.nextInt(7);TimeUnit.SECONDS.sleep(nextInt);System.out.println(Thread.currentThread().getName() + "----->>驶出十字路口");// 释放许可证semaphore.release();} catch (InterruptedException e) {e.printStackTrace();}}}
测试类
public class SemaphoreDemo01 {public static void main(String[] args) {// 创建线程任务类对象CarThreadRunnable carThreadRunnable = new CarThreadRunnable() ;// 创建5个线程对象,并启动。for(int x = 0 ; x < 5 ; x++) {new Thread(carThreadRunnable).start();}}}
控制台输出结果
Thread-0----->>正在经过十字路口
Thread-1----->>正在经过十字路口
Thread-1----->>驶出十字路口
Thread-2----->>正在经过十字路口
Thread-0----->>驶出十字路口
Thread-3----->>正在经过十字路口
Thread-2----->>驶出十字路口
Thread-4----->>正在经过十字路口
Thread-4----->>驶出十字路口
Thread-3----->>驶出十字路口
通过控制台输出,我们可以看到当某一个汽车"驶出"十字路口以后,就会有一个汽车立马驶入。