博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Jdk的java.util.concurrent包中已经实现了一个Semaphore类(信号量的用法),主要用于多线程情况下控制某个方法的并发数...
阅读量:6336 次
发布时间:2019-06-22

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

该类有如下一些特点: 

1、Semaphore是带有Counting、相当于维护了一定数量的通行证、如上面举的例子里面的100辆车 
2、该类的acquire方法是为了申请通行证的、该方法可能会Block(这里并没有使用synchronization、因为否则的话release也没法执行)、就是当通行证全部被申请完了之后。而对应的release方法则是释放通行证的、这样该方法执行后可能会让原来Block的acquire方法得以继续执行。 
3、上面2的执行过程中其实并没有类似于通行证这样的对象、Semaphore只是维护了一个许可的计数器。 
4、如果Semaphore的计数器为1(又叫binary Semaphore)的话则相当于一个互斥锁 
实际应用中、对象池和线程池都有使用如此的方式控制线程的使用量。 

 

private Semaphore semaphore;

@Override

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

semaphore = new Semaphore(5);

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

new Thread(new Runnable() {
@Override
public void run() {
showLog();
}
}).start();
}

}
private void showLog(){
try {

//获取许可

semaphore.acquire();
Log.i("xqxinfo","线程:"+Thread.currentThread().getName()+"执行了一个acquire请求操作");
} catch (InterruptedException e) {
e.printStackTrace();
}
// 线程休眠1s
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}

//释放许可

semaphore.release();
Log.i("xqxinfo","线程:"+Thread.currentThread().getName()+"执行了一个release请求操作");

}

转载于:https://www.cnblogs.com/xiaohan666/p/10275860.html

你可能感兴趣的文章
04-【MongoDB入门教程】mongo命令行
查看>>
字符串与整数之间的转换
查看>>
断点传输HTTP和URL协议
查看>>
redis 数据类型详解 以及 redis适用场景场合
查看>>
mysql服务器的主从配置
查看>>
巧用AJAX技术,通过updatePanel控件实现局部刷新
查看>>
20140420技术交流活动总结
查看>>
SaltStack配置salt-api
查看>>
各种情况下block的类型
查看>>
ThinkPHP 3.2.x 集成极光推送指北
查看>>
js作用域链
查看>>
java中如何选择Collection Class--java线程(第3版)
查看>>
为运维人员插上腾飞更远的翅膀!
查看>>
Word 2003中编辑标记与格式标记大讨论
查看>>
从国内向海外转移域名经验谈
查看>>
浅谈apache与tomact的整合
查看>>
SQL Server vNext CTP1 on Linux
查看>>
1-为 Lync Server 2010 准备 Active Directory 域服务
查看>>
NetBackup下ORACLE恢复测试方案实例解析
查看>>
【有奖征文】“失业”程序员的苦辣酸甜
查看>>