多线程-并发工具类 semaphore

178 阅读1分钟

使用场景 :

主要是可以控制访问特定资源的线程数量。

下面我来用一个案例来介绍一下semaphore的用法

需求:

模拟收费站进出车辆,设立两个进出站窗口

实现步骤 :

1,创建一个semaphore对象来管理这个通道

2,当有车进来了,发通行许可证

3,当车出去了,收回通行许可证

4,如果通行许可证发完了,那么其他车辆只能等着

代码实现: 测试类:

public class demo {
    public static void main(String[] args) {
        myrunnable mr = new myrunnable();
        for (int i = 0; i < 100; i++) {

            new Thread(mr).start();
        }
    }
}

线程实现类:

public class myrunnable implements Runnable{
    //1.创建管理员对象
    private  Semaphore semaphore = new Semaphore(2);
    //Semaphore是公共的,所以得使用成员变量共享
    @Override
    public void run() {
        //2.获取通行证
        try {
            semaphore.acquire();

            //3.开始行使
            System.out.println("获取通行证开始行使车辆");
            Thread.sleep(2000);

            //4.归还通行证
            System.out.println("归还通行证");
            semaphore.release();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

semaphore注意事项: 把他当做一个管理员对象即可 Semaphore semaphore = new Semaphore(2); 这个数值有多少通道就填多少数字

Thanks