java多线程之Semaphore

      Semaphore是计数信号量。Semaphore管理一系列许可证。每个acquire方法阻塞,直到有一个许可证可以获得然后拿走一个许可证,其类似于锁,可以控同时访问的线程个数,通过 acquire() 获取 一个许可,如果没有就等待,而 release() 释放一个许可。就如银行柜台办理业务一样,只有有空闲的柜台才可以为客户办理业务(这一点类似于线程池,只不过线程池是线程的可用数量,而Semaphore是资源可用数量)。

示例代码:

SemaphoreTest类:

public class SemaphoreTest {
	
	//初始化4个锁,假设4个银行柜台
	private final Semaphore semaphore = new Semaphore(4);
	
	public void test() {
		
		//匿名内部类的方式创建100个线程,假设100个客户
		for (int i = 0; i < 100; i++) {
			new Thread(new Runnable() {
				
				public void run() {
					
					try {
						System.out.println("当前可用柜台数量为:" + semaphore.availablePermits());
						semaphore.acquire();
						System.out.println("客户" + Thread.currentThread().getName() + "正在柜台办理业务");
						Thread.sleep(new Random().nextInt(1000));
						System.out.println("客户" + Thread.currentThread().getName() + "业务办理完成");
						System.out.println("当前剩余客户数量为:" + semaphore.getQueueLength());
						semaphore.release();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}).start();
		}
		
	}

	public static void main(String[] args) {
		new SemaphoreTest().test();
	}
}

测试结果:

java多线程之Semaphore_第1张图片

你可能感兴趣的:(java,多线程)