并发库之信号量

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

举个例子:

 

public class SemaphoreClient {

      private static final int THREAD_COUNT = 20;

      private static ExecutorService threadPool = Executors.newFixedThreadPool(THREAD_COUNT);

      private static Semaphore semaphore = new Semaphore(2);

      public static void main(String[] args) {

           for (int i = 0; i < THREAD_COUNT; i++) {

                 final int x = i + 1;

                 threadPool.execute(new Runnable() {

                      @Override

                      public void run() {

                            try {

                                  semaphore.acquire();

                                  System.out.println("Save Data"+x);

                                  System.out.println("AvailablePermits: "+semaphore.availablePermits());

                                  System.out.println("QueueLength: "+semaphore.getQueueLength());

                                  System.out.println("existsthread waiting: "+semaphore.hasQueuedThreads());

                                  semaphore.release();

                            } catch(InterruptedException e) {

                                  // TODO Auto-generatedcatch block

                                  e.printStackTrace();

                            }

                      }

                 });

           }

           threadPool.shutdown();

      }

}

 

 

上述代码有20个线程,但是只允许2个线程。其构造方法Semaphore(int Permits) 需要传递一个允许并发的线程数量。线程需要

使用Semaphore.acquire()去获取一个许可证,使用完之后归还许可证,还可以tryAcquire()方法尝试获取许可证。

availablePermits: 所允许的许可证

getQueueLength: 正在等待获取许可证的线程数

hasQueuedThreads: 是否有线程正在等待获取许可证。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莫言静好、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值