Semaphore获取厕所坑位问题

转载 2016年05月31日 16:08:04
一个计数信号量。从概念上讲,信号量维护了一个许可集合。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动。
Semaphore 通常用于限制可以访问某些资源(物理或逻辑的)的线程数目。例如,下面的类使用信号量控制对内容池的访问:
这里是一个实际的情况,大家排队上厕所,厕所只有两个位置,来了10个人需要排队。
import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.Semaphore;

public class MySemaphore extends Thread {
	private Semaphore position;
	private int id;

	public MySemaphore(int i, Semaphore s) {
		this.id = i;
		this.position = s;
	}

	public void run() {
		try {
			//有没有空厕所
			if (position.availablePermits() > 0) {
				System.out.println("顾客[" + this.id + "]进入厕所,有空位");
			}else {
				System.out.println("顾客[" + this.id + "]进入厕所,没空位,排队");
			}
			//获取到空厕所了
			position.acquire();
			System.out.println("顾客[" + this.id + "]获得坑位");
			//使用中...
			Thread.sleep((int) (Math.random() * 1000));
			System.out.println("顾客[" + this.id + "]使用完毕");
			//厕所使用完之后释放
			position.release();
		}catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String args[]) {
		ExecutorService list = Executors.newCachedThreadPool();
		Semaphore position = new Semaphore(2);//只有两个厕所
		//有十个人
		for (int i = 0; i < 10; i++) {
			list.submit(new MySemaphore(i + 1, position));
		}
		list.shutdown();
		position.acquireUninterruptibly(2);
		System.out.println("使用完毕,需要清扫了");
		position.release(2);
	}

}

java架构解密——用接口改造AOP

优化是个无止境的工作,在AOP的路上,我们走得很远,但是还有很多的工作,我们没有做,比如,将aop的业务部分封装成容器,将aop的服务部分改造成面向接口的,这样就不受具体的形式上的限制了!这样AOP的...
  • xvshu
  • xvshu
  • 2015年06月20日 00:05
  • 2216

全面分析 Spring 的编程式事务管理及声明式事务管理

开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务。通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之。 先决条...

腾讯2017年实习生编程题目(第三题)——有趣的数字 小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢?

腾讯2017年实习生编程题目(第三题) 3.有趣的数字 小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢? 输入描述:  输入包含多组测试数据。  对于每组测试...

Java/Android多线程并发、同步,线程之间通信,主、子线程的一些问题(CountDownLatch、CyclicBarrier和Semaphore)

> Java主线程等待所有子线程执行完毕再执行解决办法集: http://blog.csdn.net/fengshizty/article/details/41356845?utm_source=tu...
  • ShareUs
  • ShareUs
  • 2016年07月20日 12:49
  • 750

关于多线程引发的问题,利用semaphore解决

Mutex是一把钥匙,一个人拿了就可进入一个房间,出来的时候把钥匙交给队列的第一个。一般的用法是用于串行化对critical section代码的访问,保证这段代码不会被并行的运行。 Semap...
  • luomoBM
  • luomoBM
  • 2017年01月15日 23:00
  • 110

【读书笔记】linux系统用semaphore来解决经典的生产者-消费者问题

在Linux系统下处理多进程或多线程的并发编程时,进程/线程同步是经常要遇到的问题。而在众多同步问题的场景中,生产者-消费者问题(Producer-Consumer Problem)是一个几乎每部涉及...
  • slvher
  • slvher
  • 2013年07月14日 17:28
  • 1605

生产者消费者问题Semaphore

http://www.cnblogs.com/steady/archive/2011/04/02/2003168.html /* productandconsumer. cpp */ #i...

Mutex与Semaphore 第三部分:互斥的问题

As hopefully you can see from the previous posting, the mutex is a significantly safer mechanism to ...
  • fall221
  • fall221
  • 2016年01月09日 21:42
  • 554

深入学习理解java:高效的解决死锁问题的线程通讯方式:Semaphore 和 BlockingQueue

经典原始问题:生产者和消费者的问题,其实在实际项目中很容易遇到这样的无奈的问题,但是面对这样的问题的时候我们首先想到的就是多线程批处理,通过notify()…………的处理,但只这样的处理只能给我们贴上...

进程同步问题-生产者消费者问题(linux semaphore实现)

本文地址:学习目标: * linux 线程 * linux 信号(Semaphore)的使用 * makefile书写 * 生产者,消费者问题理解原文参考 csdn博客专家:MoreWind...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Semaphore获取厕所坑位问题
举报原因:
原因补充:

(最多只允许输入30个字)