Semaphore初探
示例一:
package com.smbea.demo.semaphore; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore; /**
* Semaphore 用于为线程加锁与释放锁
* @author hapday
* @2017年1月16日 @下午8:50:55
*/
public class SemaphoreTest { public static void main(String[] args) {
int permissionCount = 5; // 许可数
ExecutorService executorService = Executors.newCachedThreadPool();
final Semaphore semaphore = new Semaphore(permissionCount); // 声明并实例化“许可数”为 5 的 Semaphore 实例 for(int index = 0; index < 10; index++) {
try {
// 休眠 0.1 秒
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
} Runnable runnable = new Runnable() { @Override
public void run() {
try {
// 当前线程请求获取 semaphore 的“许可”;如果获得了 semaphore 的“许可”则此线程继续则行,并且 semaphore 的许可数减一;否则此线程进入阻塞状态。
semaphore.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
} System.out.println("线程:" + Thread.currentThread().getName() + " 进入,当前已有 " + (permissionCount - semaphore.availablePermits()) + " 个并发线程。"); try {
Thread.sleep((long) (Math.random() * 10000));
// Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
} System.out.println("线程:" + Thread.currentThread().getName() + " 即将离开...");
semaphore.release(); // 将当前的线程释放“许可数”,semaphore 的许可数加一,至于哪个线程先离开没有固定的顺序
System.out.println("线程:" + Thread.currentThread().getName() + " 已离开,当前已有 " + (permissionCount - semaphore.availablePermits()) + " 个并发线程已离开。");
} }; executorService.execute(runnable);
}
} }
示例二:
package com.smbea.demo.semaphore; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; /**
* Semaphore 用于为线程加锁与释放锁
* @author hapday
* @2017年1月16日 @下午8:50:55
*/
public class SemaphoreTest2 { public static void main(String[] args) {
int permissionCount = 5; // 许可数
ExecutorService executorService = Executors.newFixedThreadPool(permissionCount);
Counter counter = new Counter(); for(int index = 0; index < 8; index++) {
try {
// 休眠 0.1 秒
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
} executorService.execute(new Runnable() { @Override
public void run() {
counter.calculate();
} }); } executorService.shutdown(); } public static class Counter {
private int count = 0;
Lock lock = new ReentrantLock();
int permissionCount = 5; // 许可数
Semaphore semaphore = new Semaphore(permissionCount); public void calculate() {
// lock.lock();
try {
// 当前的线程请求获取“锁”
semaphore.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
} try {
count++; try {
// 休眠 1 秒钟
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} System.out.println("线程:" + Thread.currentThread().getName() + ",count = " + count);
} finally {
semaphore.release(); // 释放当前线程的“锁”
// lock.unlock();
} }
} }
Semaphore初探的更多相关文章
- Java中Semaphore(信号量)的使用
Semaphore的作用: 在java中,使用了synchronized关键字和Lock锁实现了资源的并发访问控制,在同一时间只允许唯一了线程进入临界区访问资源(读锁除外),这样子控制的主要目的是为了 ...
- java并发编程(四)----(JUC)Lock锁初探
首先我们来回忆一下上一节讲过的synchronized关键字,该关键字用于给代码段或方法加锁,使得某一时刻它修饰的方法或代码段只能被一个线程访问.那么试想,当我们遇到这样的情况:当synchroniz ...
- C#各种同步方法 lock, Monitor,Mutex, Semaphore, Interlocked, ReaderWriterLock,AutoResetEvent, ManualResetEvent
看下组织结构: System.Object System.MarshalByRefObject System.Threading.WaitHandle System.Threading.Mutex S ...
- 初探领域驱动设计(2)Repository在DDD中的应用
概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值类型和领域服务,也稍微讲到了DDD中的分层结构.但这只能算是一个很简单的介绍,并且我们在上篇的末尾还留下了一些问题,其中大家讨论比较多的, ...
- CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探
CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码 ...
- 多线程条件通行工具——Semaphore
Semaphore的作用是,限制线程通行的数量,如果线程进入时达到通行数量,便等待其它正在通行的线程释放. acquire()获取通行 release()释放通行 availablePermits() ...
- 从273二手车的M站点初探js模块化编程
前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数 ...
- JavaScript学习(一) —— 环境搭建与JavaScript初探
1.开发环境搭建 本系列教程的开发工具,我们采用HBuilder. 可以去网上下载最新的版本,然后解压一下就能直接用了.学习JavaScript,环境搭建是非常简单的,或者说,只要你有一个浏览器,一个 ...
- .NET文件并发与RabbitMQ(初探RabbitMQ)
本文版权归博客园和作者吴双本人共同所有.欢迎转载,转载和爬虫请注明原文地址:http://www.cnblogs.com/tdws/p/5860668.html 想必MQ这两个字母对于各位前辈们和老司 ...
随机推荐
- Juqery遮罩插件
Juqery遮罩插件,想罩哪就罩哪! 一 前言 在项目开发时发现没有一个用起来 爽一点的遮罩插件,看起来觉得不难 好吧那就利用空闲时间,自己折腾一个吧,也好把jquery再温习一下, 需要的功能 ...
- office编程必不可少
原文:office编程必不可少 [转] 1. 微软官方实例: 段落.表格.图表 HOW TO:利用 Visual C# .NET 使 Word 自动新建文档 2. 学习资源 (1)Word in th ...
- js实现文字横向滚动
页面布局 <div id="scroll_div" class="fl"> <div id="scroll ...
- nagios 安装和配置(含有nrpe结束)所有 (两)
二.ndoutils 安装: 1.mysql安装(若未安装) #apt-get install mysql-servermysql-client 2.DBI安装(若未安装) #cd /usr/loca ...
- CTP API开发期货自动交易平台概论
题目比较小众,先介绍一下CTP. 综合交易平台CTP(Comprehensive Transaction Platform)是由上海期货信息技术有限公司(上海期货交易所的全资子公司)开发的期货交易平台 ...
- ofbiz学习笔记01--多表关联查询
不管做什么项目,肯定会用到多表关联查询数据,从网络查询得知ofbiz有三种多表关联查询方法 实现一:Screem.xml 中的 section 里,加 <action>, 加 get-re ...
- UTF8国际通用为什么还要用GBK?
前序: 一直对编码很痴迷,让数据一目了然不好吗?为什么要去编码,这不是闲的没事,浪费生产力吗? 随着学习的深入,愈加觉得自己无知,世界语言千万种,在互联网的世界里如何表示他们?碰到汉字ASCii就显得 ...
- c# 数据类型占用的字节数
最近一直在使用C#中的关于各种数据类型转化为字节或者字节转化为各种数据类型进行数据解析.但是在此之前必须知道各种数据类型在字节中占的字节数. 所以在此归总. bool -> System.Boo ...
- Mac 下ll命令 command not found
在linux下习惯使用ll.la.l等ls别名的童鞋到mac os提示command not found -461deMacBook-Pro:~ root# cd ~ -461deMacBook-Pr ...
- UML和模式应用学习笔记-1(面向对象分析和设计)
UML和模式应用学习笔记-1(面向对象分析和设计) 而只是对情节的记录:此处的用例场景为:游戏者请求掷骰子.系统展示结果:如果骰子的总点数是7,则游戏者赢得游戏,否则为输 (2)定义领域模型:在领域模 ...