信号量多-threaded同步Semaphore
Semaphore它是JDK1.5一个实现后,外面有个办法同步。Semaphore能够保持其当前的线程接入号码。并提供了一个同步机制。
采用Semaphore时,可以用相同的对资源的访问进行控制的线程数。如果你有3资源,有着10要使用该资源的线程,同一时间只能有3使用线程。余7线程在等待,仅仅要3个中随意一个释放资源,那么7个线程中的一个就能够使用了。
另外。7个线程等待能够使随机获取机会,也能够是依照先来后到的顺序获得机会,这取决与Semaphore的构造时传入的參数。
单个信号量的Semaphore对象能够实现相互排斥锁的功能,而且能够是有一个线程获得了锁,再有还有一个线程去释放改锁,能够实现死锁恢复。
| 构造方法摘要 | |
|---|---|
Semaphore(int permits)创建具有给定的许可数和非公平的公平设置的 Semaphore。
|
|
Semaphore(int permits, boolean fair)
创建具有给定的许可数和给定的公平设置的 |
|
详细实现例如以下:
package andy.thread.test; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore; /**
* @author Zhang,Tianyou
* @version 2014年11月9日 下午1:49:25
*/ public class ThreadSemaphoreTest { public static void main(String[] args) {
// 定义一个缓存线程池
ExecutorService threadPool = Executors.newCachedThreadPool();
final int MAX_AVAILABLE = 100;
// 定义信号量 等待线程使用公平原则 先来后到
Semaphore semaphore = new Semaphore(MAX_AVAILABLE, true);
for (int i = 0; i < 10; i++) {
Runnable runnable = new Runnable() { @Override
public void run() {
// TODO Auto-generated method stub
try {
// 此信号量获取一个许可。在提供一个许可前一直将线程堵塞,否则线程被中断。 semaphore.acquire();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // availablePermits() 返回此信号量中当前可用的许可数。 System.out
.println("线程"
+ Thread.currentThread().getName()
+ "进入,当前已有"
+ (MAX_AVAILABLE
- semaphore.availablePermits() + "个并发"));
try {
Thread.sleep((long) (Math.random() * 10000));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} System.out.println("线程" + Thread.currentThread().getName()
+ "即将离开");
// 释放一个许可。将其返回等待线程给信号量。 semaphore.release();
}
}; threadPool.execute(runnable); } } }
执行效果例如以下:
线程pool-1-thread-1进入,当前已有1个并发
线程pool-1-thread-3进入,当前已有2个并发
线程pool-1-thread-2进入。当前已有3个并发
线程pool-1-thread-5进入,当前已有4个并发
线程pool-1-thread-7进入,当前已有5个并发
线程pool-1-thread-4进入。当前已有6个并发
线程pool-1-thread-6进入,当前已有7个并发
线程pool-1-thread-8进入,当前已有8个并发
线程pool-1-thread-9进入。当前已有9个并发
线程pool-1-thread-10进入。当前已有10个并发
线程pool-1-thread-5即将离开
线程pool-1-thread-3即将离开
线程pool-1-thread-6即将离开
线程pool-1-thread-7即将离开
线程pool-1-thread-2即将离开
线程pool-1-thread-8即将离开
线程pool-1-thread-9即将离开
线程pool-1-thread-10即将离开
线程pool-1-thread-1即将离开
线程pool-1-thread-4即将离开
版权声明:本文博主原创文章。博客,未经同意不得转载。
信号量多-threaded同步Semaphore的更多相关文章
- 重新想象 Windows 8 Store Apps (47) - 多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEvent, AutoResetEvent
[源码下载] 重新想象 Windows 8 Store Apps (47) - 多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEve ...
- [No00003C]操作系统Operating Systems进程同步与信号量Processes Synchronization and Semaphore
操作系统Operating Systems进程同步与信号量Processes Synchronization and Semaphore 进程合作:多进程共同完成一个任务 从纸上到实际:生产者− − ...
- Python学习---线程锁/信号量/条件变量同步/线程池1221
线程锁 问题现象: 多线程情况下,CPU遇到阻塞会进行线程的切换,所以导致执行了tmp-=1的值还未赋值给num=tmp,另一个线程2又开始了tmp -=1,所以导致最后的值重复赋值给了num,所以出 ...
- 使用sem_post信号量进行线程同步
写了一小段程序,测试一下线程同步的问题,如下: #include <stdio.h> #include <string.h> #include <semaphore.h& ...
- 并发编程7 管道&事件&信号量&进程池(同步和异步方法)
1,管道 2.事件 3.信号量 4.进程池的介绍&&进程池的map方法&&进程池和多进程的对比 5.进程池的同步方法和异步方法 6.重新解释同步方法和异步方法 7.回调 ...
- mfc通过信号量保证线程同步
1.声明一个全局handle,记住在cpp里也声明 extern HANDLE uiHandle; 2.创建信号量 uiHandle = CreateSemaphore(NULL,1,1,NULL); ...
- C#线程同步(5)- 信号量 Semaphore
文章原始出处 http://xxinside.blogbus.com/logs/47617134.html 预备知识:C#线程同步(1)- 临界区&Lock,C#线程同步(2)- 临界区&am ...
- [b0032] python 归纳 (十七)_线程同步_信号量Semaphore
代码: # -*- coding: utf-8 -*- """ 多线程并发同步 ,使用信号量threading.Semaphore 逻辑: 多个线程,对同一个共享变量 , ...
- 第9章 用内核对象进行线程同步(3)_信号量(semaphore)、互斥对象(mutex)
9.5 信号量内核对象(Semaphore) (1)信号量的组成 ①计数器:该内核对象被使用的次数 ②最大资源数量:标识信号量可以控制的最大资源数量(带符号的32位) ③当前资源数量:标识当前可用资源 ...
随机推荐
- [互联网面试笔试汇总C/C++-9] 实现赋值运算符函数-剑指offer
题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数. class CMyString { public: CMyString(char* pData = NULL); CMyStr ...
- ThinPHP第二十七天(kindEditor使用,$.each)
1.KindEditor简单使用实例 <js file="__PUBLIC__/kindeditor/kindeditor.js" /> <js file=&qu ...
- ORA-31626:作业不存在 ORA-31633:无法创建主表"XXX.SYS_IMPORT_FULL_05"
错误代码: ORA-31626:作业不存在 ORA-31633:无法创建主表"XXX.SYS_IMPORT_FULL_05" ORA-06512:在"SYS.DBMS_S ...
- spoj 1557 GSS3 - Can you answer these queries III 线段树
题目链接 给出n个数, 2种操作, 一种是将第x个数改为y, 第二种是询问区间[x,y]内的最大连续子区间. 开4个数组, 一个是区间和, 一个是区间最大值, 一个是后缀的最大值, 一个是前缀的最大值 ...
- Apache服务无法启动的解决方法
apache服务无法启动的解决方法 在配置apache的时候,把apache安装为服务myweb,用apacheMonitor启动myweb发现无法启动,提示:the requested operat ...
- ONFI闪存数据通道接口标准
早期的闪存产品每个厂家的设计标准各有不同,会碰到各种各样的问题,特别是到了06年之后,闪存产业市场需求开始发力,造成了迫切需要一个统一的标准来改变这个问题. 2007年1月,以英特尔,镁光,海力士,意 ...
- Hash 表详解(哈希表)
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列 ...
- [C# 基础知识系列]专题六:泛型基础篇——为什么引入泛型
引言: 前面专题主要介绍了C#1中的2个核心特性——委托和事件,然而在C# 2.0中又引入一个很重要的特性,它就是泛型,大家在平常的操作中肯定会经常碰到并使用它,如果你对于它的一些相关特性还不是很了解 ...
- JS闭包经典例题
上一篇文章谈论了闭包的概念和一些应用,并给出一个例题,这篇文章就此道例题进行讨论. function fun(n,o) { console.log(o); return { fun:function( ...
- 简单的web三层架构系统【第一版】
SQLhelper助手类编写: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using Sys ...