博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java多线程之Semaphore类基本用法
阅读量:6094 次
发布时间:2019-06-20

本文共 2207 字,大约阅读时间需要 7 分钟。

hot3.png

原文地址:

Semaphore翻译成字面意思为 信号量,Semaphore可以控同时访问的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。

  Semaphore类位于java.util.concurrent包下,它提供了2个构造器:

1
2
3
4
5
6
public 
Semaphore(
int 
permits) {          
//参数permits表示许可数目,即同时可以允许多少线程进行访问
    
sync = 
new 
NonfairSync(permits);
}
public 
Semaphore(
int 
permits, 
boolean 
fair) {    
//这个多了一个参数fair表示是否是公平的,即等待时间越久的越先获取许可
    
sync = (fair)? 
new 
FairSync(permits) : 
new 
NonfairSync(permits);
}

   下面说一下Semaphore类中比较重要的几个方法,首先是acquire()、release()方法:

1
2
3
4
public 
void 
acquire() 
throws 
InterruptedException {  }     
//获取一个许可
public 
void 
acquire(
int 
permits) 
throws 
InterruptedException { }    
//获取permits个许可
public 
void 
release() { }          
//释放一个许可
public 
void 
release(
int 
permits) { }    
//释放permits个许可

  acquire()用来获取一个许可,若无许可能够获得,则会一直等待,直到获得许可。

  release()用来释放许可。注意,在释放许可之前,必须先获获得许可。

  这4个方法都会被阻塞,如果想立即得到执行结果,可以使用下面几个方法:

1
2
3
4
public 
boolean 
tryAcquire() { };    
//尝试获取一个许可,若获取成功,则立即返回true,若获取失败,则立即返回false
public 
boolean 
tryAcquire(
long 
timeout, TimeUnit unit) 
throws 
InterruptedException { };  
//尝试获取一个许可,若在指定的时间内获取成功,则立即返回true,否则则立即返回false
public 
boolean 
tryAcquire(
int 
permits) { }; 
//尝试获取permits个许可,若获取成功,则立即返回true,若获取失败,则立即返回false
public 
boolean 
tryAcquire(
int 
permits, 
long 
timeout, TimeUnit unit) 
throws 
InterruptedException { }; 
//尝试获取permits个许可,若在指定的时间内获取成功,则立即返回true,否则则立即返回false

   另外还可以通过availablePermits()方法得到可用的许可数目。

  下面通过一个例子来看一下Semaphore的具体使用:

  假若一个工厂有5台机器,但是有8个工人,一台机器同时只能被一个工人使用,只有使用完了,其他工人才能继续使用。那么我们就可以通过Semaphore来实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public 
class 
Test {
    
public 
static 
void 
main(String[] args) {
        
int 
N = 
8
;            
//工人数
        
Semaphore semaphore = 
new 
Semaphore(
5
); 
//机器数目
        
for
(
int 
i=
0
;i<N;i++)
            
new 
Worker(i,semaphore).start();
    
     
    
static 
class 
Worker 
extends 
Thread{
        
private 
int 
num;
        
private 
Semaphore semaphore;
        
public 
Worker(
int 
num,Semaphore semaphore){
            
this
.num = num;
            
this
.semaphore = semaphore;
        
}
         
        
@Override
        
public 
void 
run() {
            
try 
{
                
semaphore.acquire();
                
System.out.println(
"工人"
+
this
.num+
"占用一个机器在生产..."
);
                
Thread.sleep(
2000
);
                
System.out.println(
"工人"
+
this
.num+
"释放出机器"
);
                
semaphore.release();            
            
catch 
(InterruptedException e) {
                
e.printStackTrace();
            
}
        
}
    
}
}

转载于:https://my.oschina.net/u/1427708/blog/710655

你可能感兴趣的文章
基础知识漫谈(2):从设计UI框架开始
查看>>
CSS float 定位和缩放问题
查看>>
第 7 章 Firewall
查看>>
lib32asound2 : Depends: libc6-i386 (>= 2.7) but it is not going to be installed
查看>>
基于Mozilla平台的扩展开发(续)----XPCOM组件篇
查看>>
使用Vitamio打造自己的Android万能播放器(7)——在线播放(下载视频)
查看>>
MySQL中group_concat函数
查看>>
【Gson】2.2.4 StackOverflowError 异常
查看>>
Bootstrap~日期控制
查看>>
解决远程桌面无法复制粘贴的问题
查看>>
Android 抓包,监控流量工具之 mitmproxy
查看>>
Entity Framework 实体框架的形成之旅--为基础类库接口增加单元测试,对基类接口进行正确性校验(10)...
查看>>
Python生成一个不含回文字符串的字符串
查看>>
ipad&mobile通用webapp框架前哨战
查看>>
WPF Aero Glass Window
查看>>
服务定位器模式(C++实现)
查看>>
【hibernate】Hibernate SQL 方言(hibernate.dialect)
查看>>
EntityFramework 7.0之初探【基于VS 2015】(十)
查看>>
JavaScript之函数定义以及类型
查看>>
ORA-01502: index &#39;INDEX_NAME&#39; or partition of such index is in unusable state
查看>>