Semaphore两个重要的方法就是semaphore.acquire() 请求一个信号量,这时候的信号量个数-1(一旦没有可使用的信号量,也即信号量个数变为负数时,再次请求的时候就会阻塞,直到其他线程释放
了信号量)semaphore.release()释放一个信号量,此时信号量个数+1
线程任务类:
public class CarThreadRunnable implements Runnable {
// 创建一个Semaphore对象,限制只允许2个线程获取到许可证
private Semaphore semaphore = new Semaphore(2) ;
@Override
public 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();
}
}
}
精品推荐
发布者:admin,如若转载,请注明出处:https://ai1024.vip/42846.html