多线程——Semaphore的使用

Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以 保证合理的使用公共资源。
Semaphore可以用于做流量控制,特别是公用资源有限的应用场景,比如数据库连接。假如有一个需求,要读取几万个文件的数据,因为都是IO密集型任务,我们可以启动几十个线程 并发地读取,但是如果读到内存后,还需要存储到数据库中,而数据库的连接数只有10个,这 时我们必须控制只有10个线程同时获取数据库连接保存数据,否则会报错无法获取数据库连 接。这个时候,就可以使用Semaphore来做流量控制。

代码实例:
假设现在有六辆车抢三个车位

  //设置三个停车位
        Semaphore parkSpace=new Semaphore(3);
        for(int i=0;i<6;i++ ){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        //抢到车位(获取许可证)
                        parkSpace.acquire();
                        System.out.println(Thread.currentThread().getName()+"抢到了停车位");
                        Thread.sleep(3000);
                        System.out.println(Thread.currentThread().getName()+"停了3秒之后离开了车位");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }finally {
                        //离开停车位(释放许可证,返回到信行量里)
                        parkSpace.release();
                    }
                }
            }).start();
        }

运行结果:

Thread-0抢到了停车位
Thread-3抢到了停车位
Thread-4抢到了停车位
Thread-4停了3秒之后离开了车位
Thread-0停了3秒之后离开了车位
Thread-3停了3秒之后离开了车位
Thread-1抢到了停车位
Thread-5抢到了停车位
Thread-2抢到了停车位
Thread-1停了3秒之后离开了车位
Thread-5停了3秒之后离开了车位
Thread-2停了3秒之后离开了车位

Process finished with exit code 0

在代码中,虽然有6个线程在执行,但是只允许3个并发执行。Semaphore的构造方法 Semaphore(int permits)接受一个整型的数字,表示可用的许可证数量。Semaphore(3)表示允 许3个线程获取许可证,也就是最大并发数是3。Semaphore的用法也很简单,首先线程使用 Semaphore的acquire()方法获取一个许可证,使用完之后调用release()方法归还许可证。还可以用tryAcquire()方法尝试获取许可证。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值