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)

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

扫描二维码关注公众号,回复: 813689 查看本文章

  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文档。

猜你喜欢

转载自qq466862016.iteye.com/blog/2220032