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. PHP判断是中文还是英文

    static function ischinese($s){ $allen = preg_match("/^[^/x80-/xff]+$/", $s); //判断是否是英文 $al ...

  2. 关于strcpy的实现.

    #include <stdio.h> #include <stdlib.h> int strlen(const char *str) { ; while(*str++!='\0 ...

  3. 富文本编辑器ckeditor继承

    新建一个web项目ckfinder,导入lib包 加入java包,编码格式UTF-8 在WebRoot下添加ckedtior以及ckfinder两个文件夹,将config.xml拷入WEB-INF中 ...

  4. WA(Write Amplification)写入放大

    WA是闪存及SSD相关的一个极为重要的属性.由于闪存必须先擦除才能再写入的特性,在执行这些操作时,数据都会被移动超过1次.这些重复的操作不单会增加写入的数据量,还会减少闪存的寿命,更吃光闪存的可用带宽 ...

  5. Static block start new thread

    Static block start new thread public class StaticThreadInit { static{ Threadt = newThread(){ public ...

  6. Android开发(26)--补间动画(Tween)的实现

    补间动画(Tween Animation) 补间动画与逐帧动画在本质上是不同的,逐帧动画通过连续播放图片来模拟动画的效果,而补间动画则是通过在两个关键帧之间补充渐变的动画效果来实现的.补间动画的优点是 ...

  7. PHP中的一个很好用的文件上传类

    <?php    class FileUpload{      private $filepath; //设置上传文件的路径   private $allowtype=array('jpg',' ...

  8. Clementine 12.0 的使用(因为比较少用,项目中用到才开始接触写一下自己的使用方法)

    首先我是根据excel的文件做的训练,就以excel来做介绍 1.打开Clementine 12.0 软件 点击软件下方的 ”源“ 即你要做训练的数据源.因为是excel文件双击excel. 2.双击 ...

  9. 行内元素有哪些?块级元素有哪些?CSS的盒模型?转载

    块级元素:div p h1 h2 h3 h4 form ul行内元素: a b br i span input selectCss盒模型:内容,border ,margin,padding css中的 ...

  10. U3d 手游优化概述

    移动平台瓶颈 体积小 芯片要求改 功耗小 影响计算系能 带宽小 传输方面受限 性能优化 资源方面 美术方面 自带地形(地形是非常占用资源的) a.控制地形的分辨率 b.地形高度图尺寸小于257 c.地 ...