`

对资源的许可访问 Semaphore用法小例

阅读更多

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

主要方法

   public Semaphore(int permits)  //构造一个指定许可数目的信号量
   public void acquire()throws InterruptedException  // 获取信号量,没有则阻塞当前线程
   public void release()  //释放一个信号量
   另外还有相应的重载方法

 

例子

以下代码描述了这样一个应用,有2台pc,5个玩家,同一时刻只能有2个玩家使用pc(因为只有2台pc嘛),同一pc同一时刻只能归于一个玩家使用

public class SemaphoreDemo {
	final static SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

	public static void main(String[] args) {
		Semaphore sem=new Semaphore(2);
		PC[]resources={new PC("PC-I"),new PC("PC-II")};
 		 
		for(int i=1;i<=5;i++){
			Player player=new Player("Player "+i,sem,resources);
            player.start();
		}
	}
    
	static class Player extends Thread{
		Semaphore sem;
		PC[]pcs;
		String playerName;
		public Player(String playerName,Semaphore sem,PC[]pcs){
			this.sem=sem;
			this.pcs=pcs;
			this.playerName=playerName;
		}
		public void run(){
			PC pc=getPC();//获取pc
			play(pc);//玩
			giveBackPC(pc);//归还pc
		}
		private void play(PC pc){
			if(pc==null)
				return;
			try {
				System.out.println(playerName+" play game with "+pc.getPcName()+" start at time "+sdf.format(new Date()));
				Thread.sleep(1000);
				System.out.println(playerName+" play game with "+pc.getPcName()+" over at time "+sdf.format(new Date()));

			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		private PC getPC(){
			try {
				sem.acquire();
			} catch (InterruptedException e) {
				e.printStackTrace();
				return null;
			}
			for(PC pc:pcs){
				if(!pc.isOccupied()){
					pc.setOccupied(true);
					return pc;
				}
			}
			return null;
		}
        private void giveBackPC(PC pc){
			if(pc!=null)
				pc.setOccupied(false);
			sem.release();
		}
	}
	
	static class PC{
		private String pcName;
		private boolean occupied=false;
		PC(String pcName){
			this.pcName=pcName;
			
		}
		 
		public String getPcName() {
			return pcName;
		}

		public void setPcName(String pcName) {
			this.pcName = pcName;
		}

		public synchronized boolean isOccupied() {
			return occupied;
		}
		public synchronized void setOccupied(boolean occupied) {
			this.occupied = occupied;
		}
		 
	}
}

 

 

输出

Player 1 play game with PC-I start at time 2011-04-14 12:59:49
Player 2 play game with PC-II start at time 2011-04-14 12:59:49
Player 2 play game with PC-II over at time 2011-04-14 12:59:50
Player 3 play game with PC-II start at time 2011-04-14 12:59:50
Player 1 play game with PC-I over at time 2011-04-14 12:59:50
Player 4 play game with PC-I start at time 2011-04-14 12:59:50
Player 4 play game with PC-I over at time 2011-04-14 12:59:51
Player 3 play game with PC-II over at time 2011-04-14 12:59:51
Player 5 play game with PC-I start at time 2011-04-14 12:59:51
Player 5 play game with PC-I over at time 2011-04-14 12:59:52

1
1
分享到:
评论

相关推荐

    C#语言Semaphore类用法实例(多线程多端口使用端口控制)

    在C#编程中,Semaphore类是线程同步和并发控制的重要工具,主要用于限制对特定资源的并发访问。在这个实例中,我们关注的是如何利用Semaphore来管理多线程对多个端口的访问,确保不会出现冲突。Semaphore类可以看作...

    semaphore控制多线程循序执行

    Semaphore是一种计数信号量,它可以有正整数值,用于管理多个线程对公共资源的访问。当信号量的值为正时,线程可以获取一个许可(或称资源),然后继续执行;当值为零时,线程会被阻塞,直到其他线程释放一个许可。...

    Semaphore 源码解析

    Semaphore是Java并发编程中的一种重要工具,主要用于控制并发线程的访问权限,实现限流或资源的互斥访问。在高并发场景下,Semaphore能够有效地防止过多的线程同时访问共享资源,从而避免系统资源耗尽,提高系统性能...

    Java中的Semaphore:深入理解与应用实践

    本文将详细介绍 Semaphore 的工作原理、使用方法以及如何在实际项目中应用它。 Semaphore 是Java并发编程中实现信号量机制的重要工具。它通过维护一个许可集来控制同时访问特定资源的线程数量,从而避免资源竞争和...

    java并发核心Semaphore 的使用思路.docx

    Semaphore是Java并发编程中的一种重要工具,它是一个计数信号量,可以用来限制对共享资源的访问权限。在Java的`java.util.concurrent`包中,Semaphore类提供了对多个线程并发访问控制的能力,允许我们设置一个固定的...

    JAVA Semaphore.docx

    Java中的Semaphore是一个并发控制工具,属于java.util.concurrent包下的一个类,它的主要作用是限制对共享资源的访问权限,以实现多线程环境中的同步和限流。Semaphore类提供了信号量的概念,允许我们设定一个固定的...

    深入浅出java Semaphore.pdf

    它主要用于控制对特定资源的并发访问,确保资源得到合理的使用。Semaphore维护了一组虚拟的许可,其数量在创建时由用户指定。在访问资源之前,线程需要调用`acquire()`方法获取许可,如果当前许可数量为0,则线程会...

    Java多线程Semaphore工具的使用详解.rar

    Semaphore,中文可译为信号量,起源于操作系统中的同步原语,用于协调多个线程对共享资源的访问。它维护了一个计数器,该计数器表示可用许可证的数量。当线程请求许可证时,如果计数器不为零,则会减少一个并允许...

    并发编程之Tools&CountDownLatch&Semaphore原理与应用1

    Semaphore,顾名思义,是一个信号量,它用于控制对共享资源的访问权限。Semaphore维护了一个许可计数,当计数大于0时,线程可以获取一个许可并继续执行;当计数为0时,线程会被阻塞,直到其他线程释放许可。...

    30 限量供应,不好意思您来晚了—Semaphore详解.pdf

    Semaphore是Java并发编程中的一种重要同步工具,它来源于操作系统中的信号量概念,主要用于限制对共享资源的并发访问数量。在Java中,Semaphore类位于`java.util.concurrent`包下,提供了控制多个线程对公共资源访问...

    java线程并发semaphore类示例

    在Java中,Semaphore类提供了对并发线程进行计数的许可管理,允许我们限制同时访问特定资源的线程数量。这在处理并发任务时非常有用,例如限制数据库连接池的大小、限制同时访问硬件设备的数量或者限制某个服务的...

    并发控制艺术:掌握CountDownLatch与Semaphore

    Semaphore(信号量)是一种广泛应用于控制对特定资源的线程访问数的工具。它基于许可的概念,允许多个线程在限制下同时访问资源,非常适合于实现资源池或限流机制。例如,在Hystrix的限流实现中就有基于信号量的方法...

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

    Java并发库Semaphore可以很轻松完成信号量掌握,Semaphore可以掌握某个资源可被同时访问的个数,通过acquire()猎取一个许可,假如没有就等待,而release()释放一个许可。 例如,在Windows下可以设置共享文件的最大...

    SemaphoreTest.kt.zip

    Semaphore是并发编程中的一个同步工具类,主要用于控制对共享资源的访问权限,它在多线程环境下起到流量控制的作用。在Kotlin中,Semaphore可以很好地帮助我们管理线程的并发数量,防止过多线程同时访问有限的资源,...

    C#使用semaphore来管理异步下载请求的方法

    `Semaphore`类是一个系统提供的同步机制,用于控制同时访问特定资源的线程数量。在这个场景中,它被用来管理异步下载请求,确保系统不会因过多的并发下载而过载。 `Semaphore`类有两个关键参数:`initialCount`和`...

    java并发工具类(CountDownLatch+Semaphore+Exchanger)

    例如,CountDownLatch可以用于确保所有参与者准备好后再开始一个活动,Semaphore可以限制并发访问特定资源的线程数量,而Exchanger则可以在多个线程之间进行精确的数据交换。了解和熟练使用这些并发工具类,能显著...

    Java基于Semaphore构建阻塞对象池

    在Java并发编程中,Semaphore是一种重要的同步工具类,它提供了对有限资源的访问控制,能够有效地管理和限制同时访问特定资源的线程数量。Semaphore在Java 5中被引入,是java.util.concurrent包的一部分,它是基于...

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

    Semaphore是Java并发编程中的一种重要工具,用于控制对有限资源的访问权限,它可以理解为一种计数信号量。与独占锁ReentrantLock不同,Semaphore允许多个线程同时访问同一资源,但会限制同时访问的数量。在Java中,...

    易语言原子锁与许可区比较源码

    3. 释放:完成对共享资源的操作后,使用“释放互斥体”释放锁,允许其他线程获取。 4. 销毁:当不再需要原子锁时,使用“销毁互斥体”释放资源。 ### 许可区(Semaphore) 许可区,又称为信号量,比原子锁提供了更...

    Java并发编程(23)并发新特性-信号量Semaphor

    信号量(Semaphore)是Java并发库中的一种工具类,它提供了一种控制多个线程对共享资源访问的方式,从而实现高级别的同步。在Java 5引入并发包`java.util.concurrent`后,信号量作为`Semaphore`类被添加,成为并发...

Global site tag (gtag.js) - Google Analytics