并发编程之Semaphore-控制并发线程数

Semaphore(信号量)用来控制并发访问的线程数量(流量控制),它通过协调各个线程来保证资源的合理使用。其内部使用的是AQS(concurrent包下很多类实现原理都是基于AQS)。Semaphore实现控制并发线程数可以抽象为停车场模型,一个固定车位的停车场,当车位满了,便不再允许新的车辆进入;若当前车库驶出多少辆,则就允许进入多少辆。Semaphore做的就是监控车位大小功能。通过构造函数new Semaphore(N)来实现,N表示最多并发访问的线程数,显然,当N=1时候,就相当于 synchronized或Lock实现的同步操作(并发数为1)。

Semaphore应用场景

例如IO密集型操作,开启了30个工作线程并发的读取文件,然后进行持久化操作,但是数据库最大连接数为20,如果不控制,就出现获取数据库连接失败错误,通过Semaphore控制并发连接数据库线程数

publicclassSemaphoreTest {

staticExecutorService executor = Executors.newFixedThreadPool(30);

staticSemaphore semaphore =newSemaphore(20);

publicstaticvoidmain(String[] args) {

for(inti =; i

executor.execute(newRunnable() {

@Override

publicvoidrun() {

try{

semaphore.tryAcquire();//获取许可证

// TODO something work

semaphore.release();//归还许可证

}catch(Exception e) {

}

}

});

}

executor.shutdown();

}

}

上述代码所示,进行时的工作线程数有30个,但是允许并发执行的只有20个,通过new Semaphore(20)设置即可,,使用semaphore.tryAcquire()来获取许可证,操作完后semaphore.release()方法来归还许可证。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180614G1486U00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动