Semaphore它是JDK1.5一个实现后,外面有个办法同步。Semaphore能够保持其当前的线程接入号码。并提供了一个同步机制。

采用Semaphore时,可以用相同的对资源的访问进行控制的线程数。如果你有3资源,有着10要使用该资源的线程,同一时间只能有3使用线程。余7线程在等待,仅仅要3个中随意一个释放资源,那么7个线程中的一个就能够使用了。

另外。7个线程等待能够使随机获取机会,也能够是依照先来后到的顺序获得机会,这取决与Semaphore的构造时传入的參数。

单个信号量的Semaphore对象能够实现相互排斥锁的功能,而且能够是有一个线程获得了锁,再有还有一个线程去释放改锁,能够实现死锁恢复。

构造方法摘要
Semaphore(int permits)


          创建具有给定的许可数和非公平的公平设置的 Semaphore

Semaphore(int permits, boolean fair)

创建具有给定的许可数和给定的公平设置的 Semaphore

详细实现例如以下:

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的更多相关文章

  1. 重新想象 Windows 8 Store Apps (47) - 多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEvent, AutoResetEvent

    [源码下载] 重新想象 Windows 8 Store Apps (47) - 多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEve ...

  2. [No00003C]操作系统Operating Systems进程同步与信号量Processes Synchronization and Semaphore

    操作系统Operating Systems进程同步与信号量Processes Synchronization and Semaphore 进程合作:多进程共同完成一个任务 从纸上到实际:生产者− − ...

  3. Python学习---线程锁/信号量/条件变量同步/线程池1221

    线程锁 问题现象: 多线程情况下,CPU遇到阻塞会进行线程的切换,所以导致执行了tmp-=1的值还未赋值给num=tmp,另一个线程2又开始了tmp -=1,所以导致最后的值重复赋值给了num,所以出 ...

  4. 使用sem_post信号量进行线程同步

    写了一小段程序,测试一下线程同步的问题,如下: #include <stdio.h> #include <string.h> #include <semaphore.h& ...

  5. 并发编程7 管道&事件&信号量&进程池(同步和异步方法)

    1,管道 2.事件 3.信号量 4.进程池的介绍&&进程池的map方法&&进程池和多进程的对比 5.进程池的同步方法和异步方法 6.重新解释同步方法和异步方法 7.回调 ...

  6. mfc通过信号量保证线程同步

    1.声明一个全局handle,记住在cpp里也声明 extern HANDLE uiHandle; 2.创建信号量 uiHandle = CreateSemaphore(NULL,1,1,NULL); ...

  7. C#线程同步(5)- 信号量 Semaphore

    文章原始出处 http://xxinside.blogbus.com/logs/47617134.html 预备知识:C#线程同步(1)- 临界区&Lock,C#线程同步(2)- 临界区&am ...

  8. [b0032] python 归纳 (十七)_线程同步_信号量Semaphore

    代码: # -*- coding: utf-8 -*- """ 多线程并发同步 ,使用信号量threading.Semaphore 逻辑: 多个线程,对同一个共享变量 , ...

  9. 第9章 用内核对象进行线程同步(3)_信号量(semaphore)、互斥对象(mutex)

    9.5 信号量内核对象(Semaphore) (1)信号量的组成 ①计数器:该内核对象被使用的次数 ②最大资源数量:标识信号量可以控制的最大资源数量(带符号的32位) ③当前资源数量:标识当前可用资源 ...

随机推荐

  1. 用C++写一个简单的订阅者

    打开一个终端,进入到beginner_tutorials包下面: cd ~/catkin_ws/src/beginner_tutorials 建立文件src/listener.cpp: vim src ...

  2. leetcode String to Integer (atoi) python

    class Solution(object): def myAtoi(self, str): """ :type str: str :rtype: int "& ...

  3. Spark源码学习1

    转自:http://www.cnblogs.com/hseagle/p/3664933.html 一.基本概念(Basic Concepts) RDD - resillient distributed ...

  4. nodejs事件机制

    var EventEmitter = function() { this.evts = {}; }; EventEmitter.prototype = { constructor: EventEmit ...

  5. 在python文本编辑器里如何设置Tab为4个空格

    python中缩进一般为四个空格,我总结3种常用编辑器中种如何设置Tab键为四个空格 第一种:下载python3.5时自带de 一个IDLE编辑器 在Options选项下的Configure IDLE ...

  6. IOS 特定于设备的开发:Core Motion基础

    Core Motion框架集中了运动数据处理.该框架是在IOS 4 SDK中引入的,用于取代accelerometer加速计访问.它提供了对3个关键的机载传感器的集中式监测.这些传感器有陀螺仪.磁力计 ...

  7. Windows 取得至高无上的权限

    第一步:gpedit.msc 第二步:计算机配置-->windows 设置 -->安全设置 -->安全选项 -->用户账户控制 -->以管理员批准模式运行所有管理员 -- ...

  8. Mysql mysqlimport 导入数据

    在mysql 数据库中可以用 mysqlimport 工具来实现数据的导入!mysqlimport 导入数据简单,但是这个也要满足一定的条件 1.既然是把数据导入到数据库,你总有一个数据库用户账号吧 ...

  9. Oracle SQL CPU占用高

    Oracle数据库经常会遇到CPU利用率很高的情况,这种时候大都是数据库中存在着严重性能低下的SQL语句,这种SQL语句大大的消耗了CPU资源,导致整个系统性能低下.当然,引起严重性能低下的SQL语句 ...

  10. pyqt中使用matplotlib绘制动态曲线 – pythonic

    一.项目背景: 看了matplotlib for python developers这本书,基本掌握了在pyqt中显示曲线的做法,于是自己写一个. 二.需求描述: 1)X轴显示时间点,显示长度为1分钟 ...