Java 并发包中Semaphore 类的使用详解

Java 新民 631℃ 已收录 0评论

类 java.util.concurrent.Semaphore 提供了一个计数信号量,从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release()添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore只对可用许可的号码进行计数,并采取相应的行动。

Semaphore  通常用于限制可以访问某些资源(物理或逻辑的)的线程数目。

举个例子:一共有10个线程去使用资源,但资源只有五个,在这种场景下,只会有前5个线程才能在第一时间获得资源,后5个线程就会一直等待,等到资源被释放,后5个资源才能获取到资源。

代码实现如下:

	package demo1;

	import java.util.Random;
	import java.util.concurrent.Semaphore;

	class Parent extends Thread{
		
		private Semaphore semaphore ;
		
		private String name;
		
		public  Parent(Semaphore semaphore,String name) {
			this.semaphore = semaphore;
			this.name = name;
		}
		
		@Override
		public void run() {
			// 获取资源后减1后的剩余资源
			int availablePermits = semaphore.availablePermits();

			// 判断是有资源可获取
			if(availablePermits > 0 ){
				System.out.println(name+"还有资源,准备获得资源");
			}else{
				System.out.println(name+"没有资源了");
			}
			
			try {
				// 获取资源
				semaphore.acquire();
				System.out.println(name+"执行获取资源");
				
				Thread.sleep(new Random().nextInt(1000));
				
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally{
				System.out.println(name+"获取资源完成,释放资源");
				// 释放资源
				semaphore.release();
			}
			 
		}
	}

	public class ThreadDemo1 {
		
		public static void main(String[] args) throws InterruptedException {
			
			Semaphore semaphore = new Semaphore(5);
			for (int i = 1; i< 10 ; i++ ) {
				new Parent(semaphore, "第"+i+"个线程:").start();
			}
		}
	}

看如下执行日志:

本站文章如未注明,均为原创丨本网站采用BY-NC-SA协议进行授权,转载请注明转自:https://www.snowruin.com/?p=1731
喜欢 (1)or分享 (0)
发表我的评论
取消评论
表情 代码 贴图 加粗 链接 私信 删除线 签到

Hi,请填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址