`
qq466862016
  • 浏览: 125557 次
  • 来自: 杭州
社区版块
存档分类
最新评论

4、Java5多线程---信号量(Semaphore)的使用

阅读更多

Java5多线程---信号量(Semaphore)的使用

一、简介

 

Semaphore 也是一个java并发包中的一个非常有用的类,一个计数信号量。从概念上讲,信号量维护了一个许可的集。如果有必要,在许可可用前会阻塞每个 acquire(),然后再获取许可。每个relase()添加一个许可,从而可能释放一个正在阻塞的获取这。但是不使用实际的许可对象,Semaphore只对可用的许可的号码进行计数,并采取相应的行动。一般Semaphore 通常用于限制并发访问的某些资源的线程数目。下面有关Smaphore类相关的几个方法说明:

       1、void acquire()

     从信号量获取一个许可,在提供一个许前当前线程会阻塞,如果成功获取了许可并立即返回,将信号量中的有用许可减一

     2、acquireUninterruptibly()

与acquire()方法相同,但是当前线程在等待许可被中断,那么他会继续等待

   3、tryAcquire()

仅仅调用此信号量存在一个可用的许可,如果存在返回true ,不存在则返回false 并立即返回 。

  4、tryAcquire(0,TimeUnit.SECONDS)

在单位等待时间内获取许可,这样希望是遵守公平的设置,如果已经超出等待时间会立即返回。

  5、release()

释放一个许可,将其归还给指定的信号量

6、其它具体参考 官方API文档

二、应用案例

在现实的生活中,我们每天去餐厅吃饭,比如去kfc 。在kfc里面只有5个座位 一共来了21人要卖鸡腿吃饭,谁先买完东西谁先坐下吃饭,那么就像信号量中好比 kfc  5个座位好比5个许可 吃饭过程-- 找座位-吃饭-离开

就像信号量的一样,获取许可-执行任务-归还许可具体实现代码如下:

package java5;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

/**
 * 信号量 Seamphone 的使用
 * @author dongtian
 * @date   2015年6月16日 下午1:34:19
 */
public class ShopPool {

	
	
	
	
	public static void main(String[] args) {
		
		final Semaphore semaphore = new Semaphore(5);
		ExecutorService executorService = Executors.newCachedThreadPool();
		
		for (int i = 0; i < 21; i++) {
			
		
			final String name = "冬天"+ i;
			
			executorService.execute(new Runnable() {
				
				@Override
				public void run() {
					
					try {
						System.err.println(name +"进KFC买完东西正在找座位  .....");
						semaphore.acquire();
						System.err.println(name +"找到座位....吃饭.");
						Thread.sleep(3000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}finally {
						System.err.println(name +"吃完饭了 让座位 离开KFC.");
						semaphore.release();
					}
					
				}
			});
		}
		executorService.shutdown();
	}
}

 运行结果如下:

冬天0进KFC买完东西正在找座位  .....
冬天0找到座位....吃饭.
冬天1进KFC买完东西正在找座位  .....
冬天1找到座位....吃饭.
冬天3进KFC买完东西正在找座位  .....
冬天3找到座位....吃饭.
冬天4进KFC买完东西正在找座位  .....
冬天4找到座位....吃饭.
冬天2进KFC买完东西正在找座位  .....
冬天2找到座位....吃饭.
冬天1吃完饭了 让座位 离开KFC.
冬天4吃完饭了 让座位 离开KFC.
冬天0吃完饭了 让座位 离开KFC.
冬天6进KFC买完东西正在找座位  .....
冬天3吃完饭了 让座位 离开KFC.
冬天5进KFC买完东西正在找座位  .....
冬天5找到座位....吃饭.
冬天8进KFC买完东西正在找座位  .....
冬天8找到座位....吃饭.
冬天6找到座位....吃饭.
冬天7进KFC买完东西正在找座位  .....
冬天7找到座位....吃饭.
冬天2吃完饭了 让座位 离开KFC.
冬天9进KFC买完东西正在找座位  .....
冬天9找到座位....吃饭.
冬天8吃完饭了 让座位 离开KFC.
冬天5吃完饭了 让座位 离开KFC.
冬天10进KFC买完东西正在找座位  .....
冬天10找到座位....吃饭.
冬天11进KFC买完东西正在找座位  .....
冬天11找到座位....吃饭.
冬天6吃完饭了 让座位 离开KFC.
冬天12进KFC买完东西正在找座位  .....
冬天12找到座位....吃饭.
冬天7吃完饭了 让座位 离开KFC.
冬天9吃完饭了 让座位 离开KFC.
冬天14进KFC买完东西正在找座位  .....
冬天14找到座位....吃饭.
冬天13进KFC买完东西正在找座位  .....
冬天13找到座位....吃饭.
冬天11吃完饭了 让座位 离开KFC.
冬天15进KFC买完东西正在找座位  .....
冬天10吃完饭了 让座位 离开KFC.
冬天15找到座位....吃饭.
冬天16进KFC买完东西正在找座位  .....
冬天16找到座位....吃饭.
冬天12吃完饭了 让座位 离开KFC.
冬天14吃完饭了 让座位 离开KFC.
冬天18进KFC买完东西正在找座位  .....
冬天18找到座位....吃饭.
冬天13吃完饭了 让座位 离开KFC.
冬天19进KFC买完东西正在找座位  .....
冬天19找到座位....吃饭.
冬天17进KFC买完东西正在找座位  .....
冬天17找到座位....吃饭.
冬天16吃完饭了 让座位 离开KFC.
冬天20进KFC买完东西正在找座位  .....
冬天20找到座位....吃饭.
冬天15吃完饭了 让座位 离开KFC.
冬天19吃完饭了 让座位 离开KFC.
冬天18吃完饭了 让座位 离开KFC.
冬天17吃完饭了 让座位 离开KFC.

      Semaphore的使用,让我们可以很好的控制访问资源的并发数量的控制,具体更多详情请参考官方的API文档。

 

分享到:
评论

相关推荐

    JAVA多线程--信号量(Semaphore)_.docx

    JAVA多线程--信号量(Semaphore)_.docx

    JAVA 多线程之信号量(Semaphore)实例详解

    主要介绍了JAVA 多线程之信号量(Semaphore)实例详解的相关资料,需要的朋友可以参考下

    Java信号量Semaphore

    Semaphore  Semaphore分为单值和多值两种,前者只能被一个线程获得,...单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,再由另一个线程释放“锁”,这可应用于死锁恢复的一些场

    个人总结的深入java多线程开发

    6)信号量Semaphore 31 7)ReentrantLock可重入的互斥锁定 Lock 32 8)阻塞队列BlockingQueue 34 9)已完成任务队列CompletionService 36 10)计时器CountDownLatch 37 11)周期性同步工具CyclicBarrier 38 12)异步计算的...

    带你看看Java的锁(二)-Semaphore

    Semaphore 中文称信号量,它和ReentrantLock 有所区别,ReentrantLock是排他的,也就是只能允许一个线程拥有资源,Semaphore是共享的,它允许多个线程同时拥有资源,是AQS中共享模式的实现,在前面的AQS分析文章中,...

    Java多线程之并发工具类

     3)Semaphore(信号量:控制并发进程数)  主要参考资料:java并发编程的艺术、Java并发——同步工具类  二、CountDownLatch(同步倒数计数器)–不仅仅用于多线程  1.作用:允许一个或多个线程等待其他线程...

    详解java多线程的同步控制

    目录线程安全 Thread Safety重入锁 ReentrantLock读写锁 ReadWriteLock倒计数器 CountDownLatch循环栅栏 CyclicBarrier信号量 Semaphore 线程安全 Thread Safety JMM JMM(Java Memory Model)是一种基于计算机内存...

    python多线程DAY04.txt

    2. 信号量 Semaphore() acquire() 删除 release() 增加 get_value() 获取 3. 同步互斥机制 : 解决了多个进程或者线程对共享资源的争夺 Event e.set e.clear e.wait Lock lock.acquire() lock.release() 4...

    迅雷笔试题java-concurrent_download:Java多线程并发下载器,支持断点下载(手写不限速的迷你版迅雷)

    Java并发编程:03-多线程并发下载器, 支持断点下载(手写不限速的迷你版迅雷) 主要是最近学习完一些初级的并发知识, 所以想使用这些知识做一个小小工具, 巩固一下知识点, 然后就想到了多线程并发下载文件的这个小工具...

    Java并发编程(学习笔记).xmind

    信号量(Semaphore) 用来控制同时访问某个特定资源的操作数量,或者同时执行某个指定操作的数量 管理者一组虚拟的许可。acquire获得许可(相当于P操作),release释放许可(相当于V操作) 应用...

    Java并发编程实战

    5.5.3 信号量82 5.5.4 栅栏83 5.6 构建高效且可伸缩的结果缓存85 第二部分 结构化并发应用程序 第6章 任务执行93 6.1 在线程中执行任务93 6.1.1 串行地执行任务94 6.1.2 显式地为任务创建线程94 6.1.3 ...

    构架Java并发模型框架

    Java的多线程特性为构建高性能的应用提供了极大的方便,但是...对于方法重入的保护,信号量(semaphore)和临界区(critical section)机制的实现都非常简洁。可以很容易的实现多线程间的同步操作从而保护关键数据的一

    这就是标题—— JUC.pdf

    Semaphore(信号量,流量控制) ReentrantReadWriteLock (读写锁) BlockingQueue(阻塞队列) 线程池 池化技术 线程池的优势 线程池的特点 线程池三大方法 线程池七大参数 线程池四种拒绝策略 ForkJoin 异步回调 ...

    javaSE代码实例

    17.4 信号量的使用 393 17.4.1 Semaphore类简介 393 17.4.2 Semaphore类的具体使用 394 17.5 队列 396 17.5.1 Queue接口介绍 396 17.5.2 PriorityQueue类的知识与使用 397 17.5.3 BlockingQueue接口...

    java核心知识点整理.pdf

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    JAVA核心知识点整理(有效)

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

Global site tag (gtag.js) - Google Analytics