并发工具类(三)控制并发线程数的Semaphore
来源:互联网 发布:php 反射获取类变量 编辑:程序博客网 时间:2024/05/21 19:20
简介
Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。很多年以来,我都觉得从字面上很难理解Semaphore所表达的含义,只能把它比作是控制流量的红绿灯,比如XX马路要限制流量,只允许同时有一百辆车在这条路上行使,其他的都必须在路口等待,所以前一百辆车会看到绿灯,可以开进这条马路,后面的车会看到红灯,不能驶入XX马路,但是如果前一百辆中有五辆车已经离开了XX马路,那么后面就允许有5辆车驶入马路,这个例子里说的车就是线程,驶入马路就表示线程在执行,离开马路就表示线程执行完成,看见红灯就表示线程被阻塞,不能执行。
应用场景
Semaphore可以用于做流量控制,特别公用资源有限的应用场景,比如数据库连接。假如有一个需求,要读取几万个文件的数据,因为都是IO密集型任务,我们可以启动几十个线程并发的读取,但是如果读到内存后,还需要存储到数据库中,而数据库的连接数只有10个,这时我们必须控制只有十个线程同时获取数据库连接保存数据,否则会报错无法获取数据库连接。这个时候,我们就可以使用Semaphore来做流控,代码如下:
01
public
class
SemaphoreTest {
02
03
private
static
final
int
THREAD_COUNT =
30
;
04
05
private
static
ExecutorService threadPool = Executors
06
.newFixedThreadPool(THREAD_COUNT);
07
08
private
static
Semaphore s =
new
Semaphore(
10
);
09
10
public
static
void
main(String[] args) {
11
for
(
int
i =
0
; i < THREAD_COUNT; i++) {
12
threadPool.execute(
new
Runnable() {
13
@Override
14
public
void
run() {
15
try
{
16
s.acquire();
17
System.out.println(
"save data"
);
18
s.release();
19
}
catch
(InterruptedException e) {
20
}
21
}
22
});
23
}
24
25
threadPool.shutdown();
26
}
27
}
在代码中,虽然有30个线程在执行,但是只允许10个并发的执行。Semaphore的构造方法Semaphore(int permits) 接受一个整型的数字,表示可用的许可证数量。Semaphore(10)表示允许10个线程获取许可证,也就是最大并发数是10。Semaphore的用法也很简单,首先线程使用Semaphore的acquire()获取一个许可证,使用完之后调用release()归还许可证。还可以用tryAcquire()方法尝试获取许可证。
其他方法
Semaphore还提供一些其他方法:
- int availablePermits() :返回此信号量中当前可用的许可证数。
- int getQueueLength():返回正在等待获取许可证的线程数。
- boolean hasQueuedThreads() :是否有线程正在等待获取许可证。
- void reducePermits(int reduction) :减少reduction个许可证。是个protected方法。
- Collection getQueuedThreads() :返回所有等待获取许可证的线程集合。是个protected方法。
- 并发工具类(三)控制并发线程数的Semaphore
- 并发工具类(三)控制并发线程数的Semaphore
- 控制并发线程数的Semaphore
- 控制并发线程数的Semaphore
- Semaphore控制线程并发数
- JAVA中的并发工具类(一)----控制并发数的Semaphore
- (java多线程并发)控制并发线程数的Semaphore
- Java线程(CountDownLatch、CyclicBarrier、Semaphore)并发控制工具类
- Semaphore 控制并发访问线程数
- 控制并发访问的线程数 Semaphore 信号灯
- 并发工具类(三)控制并发线程的数量 Semphore
- Java线程总结(九):并发包------控制并发线程数Semaphore
- 线程池ExecutorService 中并发数的(引入信号量Semaphore)控制执行
- (java多线程并发)控制并发线程数的Semaphore、ScheduledThreadPoolExcutor、BlockingQueue、ReadWriteLock
- 线程并发工具--Semaphore(信号灯)
- 控制并发线程数的Semaphore和线程之间的数据交换Exchanger
- Java中的Semaphore--用于多线程中控制资源并发访问的线程数
- Java并发库(十四):控制线程访问数量Semaphore
- HDU 1089 A+B for Input-Output Practice (I)
- SVN服务器客户端搭建版本控制
- 连连看
- hdu 5012 Dice 2014 ACM/ICPC Asia Regional Xi'an Online bfs
- MCMC(Markov Chain Monte Carlo) and Gibbs Sampling
- 并发工具类(三)控制并发线程数的Semaphore
- hdu 5007 Post Robot 水题
- 移动硬盘格式化成FAT32分区方法
- 集线器(HUB),交换机,和路由器的区别
- static有什么作用?
- 为什么中国人说英语有时候听起来没有礼貌?
- 以 脚本精灵 为例,简单说说怎么制作apk共存包
- xcode5中的Provisioning Profile删除
- java配置文件property文件内容的修改