现在的位置: 首页 > 综合 > 正文

java多线程同步工具之Semaphore信号灯

2018年06月05日 ⁄ 综合 ⁄ 共 1067字 ⁄ 字号 评论关闭

Semaphore可以维护当前访问自身的线程个数,并提供了同步机制,使用Semaphore可以控制同时访问资源的个数。举一个通俗的例子:厕所里有5个坑,加入有十个人要上厕所,那么同时只能有5个人能够占用,当这5个人中的任何一个人用完之后,等待的5个人中又有一个人可以占用。

方法:

acquire():霸占一个信号灯。

availablePermits():获取可以提供的信号灯。

release():释放信号灯。

案例:

public class SemaphoreTest {

	public static void main(String[] args) {

		/*创建一个线程池*/
		ExecutorService executorService = Executors.newCachedThreadPool();
		/*创建一个信号灯对象【初始化3个灯】*/
		final Semaphore semaphore = new Semaphore(3);
		
		for (int i=0; i<10;i++){
			
			Runnable runnable = new Runnable() {
				
				@Override
				public void run() {
				/*************获取一个信号灯************/
					try {
						semaphore.acquire();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					
					System.out.println(Thread.currentThread().getName() +", 进入,当前已有 " + (3 - semaphore.availablePermits()) +"并发");
					
				/************休眠******************/
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					
				/**************释放信号灯*************/	
					System.out.println(Thread.currentThread().getName() +"即将离开");
					
					semaphore.release();//释放信号灯
					System.out.println(Thread.currentThread().getName() +", 已离开,当前还有 " + (3 - semaphore.availablePermits()) +"并发");
					
				}
			};
			
			/*执行*/
			executorService.execute(runnable);
		}
	}

}

抱歉!评论已关闭.