JAVA多线程——Semaphore

模拟信号灯:6辆汽车,只有三个停车位,每次只能停放三辆汽车,剩下的汽车需等待前面的汽车开走之后才能进入停放。

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

/**
 * @author huangdh
 * @version 1.0
 * @description: 信号灯
 * @date 2022-10-30 11:35
 */
public class SemaphoreDemo {

    /**
     *   * Semaphore
     * 一个计数信号量。 在概念上,信号量维持一组许可证。 如果有必要,每个acquire()都会阻塞,直到许可证可用,然后才能使用它。
     * 每个release()添加许可证,潜在地释放阻塞获取方。 但是,没有使用实际的许可证对象; Semaphore只保留可用数量的计数,并相应地执行。
     *
     * 模拟信号灯:6辆汽车,只有三个停车位,每次只能停放三辆汽车,剩下的汽车需等待前面的汽车开走之后才能进入停放
     * @param args
     */

    public static void main(String[] args) {

        // 创建 Semaphore ,设置许可数量
        Semaphore semaphore = new Semaphore(3);

        for (int i = 0; i < 20; i++) {
            new Thread(()->{
                // 抢占
                try {
                    semaphore.acquire();

                    System.out.println(Thread.currentThread().getName() + "抢到车位了");
                    // 设置随机停车的时间
                    try {
                        TimeUnit.SECONDS.sleep(new Random().nextInt(5));
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + "----------离开车位了");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    semaphore.release();
                }
            },String.valueOf(i)).start();
        }
    }
}

 运行结果:

0抢到车位了
3抢到车位了
1抢到车位了
1----------离开车位了
3----------离开车位了
5抢到车位了
2抢到车位了
0----------离开车位了
6抢到车位了
6----------离开车位了
4抢到车位了
4----------离开车位了
8抢到车位了
2----------离开车位了
7抢到车位了
7----------离开车位了
8----------离开车位了
5----------离开车位了

 

posted @ 2022-11-20 15:40  BlogMemory  阅读(53)  评论(0编辑  收藏  举报