Semaphore并发包使用Demo

Semaphore常用方法说明

acquire()  
获取一个令牌在获取到令牌或者被其他线程调用中断之前线程一直处于阻塞状态acquire(int permits)  
获取一个令牌在获取到令牌或者被其他线程调用中断或超时之前线程一直处于阻塞状态acquireUninterruptibly() 
获取一个令牌在获取到令牌之前线程一直处于阻塞状态忽略中断)。
    
tryAcquire()
尝试获得令牌返回获取令牌成功或失败不阻塞线程tryAcquire(long timeout, TimeUnit unit)
尝试获得令牌在超时时间内循环尝试获取直到尝试获取成功或超时返回不阻塞线程release()
释放一个令牌唤醒一个获取令牌不成功的阻塞线程hasQueuedThreads()
等待队列里是否还存在等待线程getQueueLength()
获取等待队列里阻塞的线程数drainPermits()
清空令牌把可用令牌数置为0返回清空令牌的数量availablePermits()
返回可用的令牌数量

用semaphore 实现停车场提示牌功能。

 

每个停车场入口都有一个提示牌,上面显示着停车场的剩余车位还有多少,当剩余车位为0时,不允许车辆进入停车场,直到停车场里面有车离开停车场,这时提示牌上会显示新的剩余车位数。

 

业务场景 :

1、停车场容纳总停车量10。

2、当一辆车进入停车场后,显示牌的剩余车位数响应的减1.

3、每有一辆车驶出停车场后,显示牌的剩余车位数响应的加1。

4、停车场剩余车位不足时,车辆只能在外面等待。

import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

public class SemaphoreDemo {
	public static void main(String[] args) {
		/*
		 * Semaphore semaphore = new Semaphore(3);//最多支持多少个线程 for (int i = 1; i <= 10;
		 * i++) { new User(semaphore, i + "线程").start(); }
		 */
		// 有3个车位当占满时,semaphore为0,当走了一个车时,
		// semaphore.release()则加1释放出来一个车位
		Semaphore semaphore = new Semaphore(3);// 型号灯,值是伸缩的,用满了0,空出来加,模拟3个停车位
		for (int i = 1; i <= 10; i++) {// 模拟10部汽车
			new Thread(() -> {
				try {
					semaphore.acquire();// 占到车位
					System.out.println(Thread.currentThread().getName() + "\t 抢占到车位");
					TimeUnit.SECONDS.sleep(3);// 停3秒,后出去
					System.out.println(Thread.currentThread().getName() + "\t 停车3秒后离开车位");
				} catch (InterruptedException e) {
					e.printStackTrace();
				} finally {
					semaphore.release();// 释放停车位
				}
			}, String.valueOf(i)).start();
		}
	}
}

  

 

posted on 2020-06-30 18:01  东子z  阅读(318)  评论(0编辑  收藏  举报

导航