- 浏览: 62656 次
- 性别:
- 来自: 北京
最新评论
-
wucaifang819787:
你好!麻烦问下不知道哪个图片行不行的:http://dl.it ...
struts2源码浅析(四) -
ChenXzh:
高手,佩服得五体投地
关于struts2报There is no Action mapped for namespace / and action name xxx_xxx
在http://my.oschina.net/xpbug/blog/88259上看到的并发问题---上厕所问题,博主使用的是内置锁实现的, 利用空闲时间改为使用可重入锁实现,写的过程充斥着对并发知识的复习,又翻起了Goetz的并发编程实践,真是好书啊。
直接上代码了,题目在代码里
package org.waitingfortime.并发趣题; import java.util.Random; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * Created by IntelliJ IDEA. * User: mazhiyuan * Date: 12-11-20 * Time: 下午5:55 * 一个厕所有3个坑,人们不停的进厕所做xuxu的事情.排量随机,蹲坑时间随机. * 厕所的容量(capacity)为100, 当厕所的排量(volume)超过容量的时候, 通知清洁工来清洁. * 清洁过程中不能再放新人进来. 厕所每天只服务100个人,然后停业. */ public class ToiletQ1 { public static void main(String[] args) { new ToiletQ1().test(); } private void test() { Toilet toilet = new Toilet(); boolean allowed = true; for (int i = 0; allowed; i++) { People p = new People(i + "", toilet); allowed = toilet.allow(p); } } class Toilet { private volatile AtomicBoolean cleaning = new AtomicBoolean(false); private volatile AtomicInteger volume = new AtomicInteger(0); private volatile AtomicInteger count = new AtomicInteger(0); private volatile AtomicInteger peopleIn = new AtomicInteger(0); private final int CAPACITY = 100; //3 holes all ExecutorService holes = Executors.newFixedThreadPool(3); Lock in = new ReentrantLock(); Condition yes = in.newCondition(); Cleaner cleaner; public Toilet() { this.cleaner = new Cleaner(this); } boolean allow(Runnable people) { in.lock(); try { while (cleaning.get() == true || peopleIn.get() >= 3) try { yes.await(); } catch (InterruptedException e) { e.printStackTrace(); } if (count.get() > 100) { holes.shutdown(); return false; } else { enter(((People) people).name); holes.submit(people); return true; } } finally { in.unlock(); } } private void enter(String name) { System.out.println("People[" + name + "] comes in."); peopleIn.incrementAndGet(); count.incrementAndGet(); } private void exit(String name) { System.out.println("People[" + name + "] comes out."); peopleIn.decrementAndGet(); in.lock(); try { yes.signal(); } finally { in.unlock(); } } private void notifyCleaner() { if (cleaning.get() == false) { clean(); System.out.println("Toilet volume full with [" + volume.get() + "]. Notify cleaner."); holes.submit(cleaner); } } public void xuXu(String name, int i) { volume.addAndGet(i); System.out.println("People[" + name + "] put in [" + i + "]. Toilet volume increases to [" + volume.get() + "]"); if (volume.get() >= CAPACITY) { notifyCleaner(); } } public void clean() { cleaning.getAndSet(true); } public void cleaned() { volume.getAndSet(0); cleaning.getAndSet(false); in.lock(); try { yes.signal(); } finally { in.unlock(); } } } class People implements Runnable { String name; Toilet toilet; public People(String name, Toilet toilet) { this.name = name; this.toilet = toilet; } @Override public void run() { System.out.println("People[" + name + "] is xu xu xu..."); try { Thread.sleep(new Random().nextInt(100)); } catch (InterruptedException e) { e.printStackTrace(); } toilet.xuXu(name, new Random().nextInt(11)); toilet.exit(name); } } class Cleaner implements Runnable { private Toilet toilet; private Cleaner(Toilet t) { this.toilet = t; } @Override public void run() { // toilet.clean(); System.out.println("Toilet Cleaning..."); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Toilet Clean done."); toilet.cleaned(); } } }
发表评论
-
第八章 最大自序列和
2012-11-01 20:29 833第八章的问题是常见的---最大自序列和 的问题 书中提 ... -
第二章 旋转字符串的思考
2012-10-26 16:09 845编程珠玑第二章旋转字符串,abcdefg向左旋转3位,变为de ... -
Mongdb的upsert出现E11000 duplicate key errors的错误分析
2012-10-25 17:36 9153昨日上线的系统,今天查日志时发现有不少E11000 dupli ... -
开源的Mongodb java client -- mango发布
2012-07-20 21:53 1852Mango ---- 一个非常简单的操作mongodb的 ... -
SOAP消息
2012-03-05 20:37 1258本文转自:http://blog.csdn.net/chang ... -
wsdl文档结构
2012-03-05 20:32 1505本文转自:http://blog.csdn.net/chang ... -
浅出Apache Cxf
2012-03-05 20:14 0由于业务需要,开放了系统的 Web Se ... -
struts2源码浅析(四)
2011-10-19 17:15 1512接上一篇讲了filter后,现在request到了action ... -
struts2源码浅析(三)
2011-10-19 16:50 1568接上篇http://mazhiyuan.iteye.com/b ... -
struts2源码浅析(二)
2011-10-19 16:34 2226接上一篇http://mazhiyuan.iteye.com/ ... -
struts2源码浅析(一)
2011-10-19 16:18 17271. Struts2架构图 请求首先通过Filter ... -
struts2.1权威指南-笔记
2010-12-19 22:36 10951.struts 1.x 和 struts 2.x的 ... -
Hibernate学习总结4---对象状态
2010-12-10 16:14 947session 的几个主要方法: 1,save方法和persi ... -
Hibernate学习总结3 --配置文件
2010-12-10 16:10 937如果不希望使用默认的hibernate.cfg.xml 文件作 ... -
Hibernate 学习总结一
2010-12-10 14:54 862引入: 模型不匹配(阻 ... -
HF servlet&jsp 前6章要点总结
2010-11-21 11:58 880今天有时间把前6章主要讲servlet的内容坐下总结。好了,开 ... -
jquery源码分析之属性篇
2010-11-20 20:09 1913jquery提供了一些快捷函 ... -
HF servelt&jsp 定制标记开发 要点总结
2010-11-13 11:41 13061.标记文件使用一个页 ... -
bean相关标准动作总结+复习
2010-11-07 23:22 7551.<jsp:useBean>动作会定义一个变量, ... -
HF servlet&jsp ---include 指令和动作元素
2010-11-07 23:02 8101.include的2种方式 include多用于网站中可重用 ...
相关推荐
Java多线程--等待所有子线程执行完的五种方法 Java多线程--等待所有子线程执行完的五种方法 Java多线程--等待所有子线程执行完的五种方法 Java多线程--等待所有子线程执行完的五种方法 Java多线程--等待所有子线程...
Java多线程--线程安全问题练习题
Java多线程-Socket编程
Java多线程--多线程相关概念
Java多线程--让主线程等待所有子线程执行完毕
Java多线程--线程的安全问题与线程的同步机制介绍
Java多线程--线程间的通信
Java多线程--线程的生命周期
Java多线程--生产者与消费者问题
Java多线程--多线程知识点总结和企业真题
Java多线程--对比创建多线程的两种方式
Java多线程-多功能演示系统,连接MySQL数据库利用多线程实现信息交流,为教师提供教学服务,便于教师整理教学资料,整合所需知识内容,更好的为学生提供生动形象的理解方式,加强教师与学生之间的互动沟通。
java多线程按需交替执行,java新特性。
Java多线程--JDK5.0新增线程创建方式
Java多线程--同步机制解决线程安全问题方式二:同步方法
Java多线程--创建多线程的基本方式二:实现Runnable接口
Java多线程--创建多线程的基本方式一:继承Thread类
Java多线程--同步机制解决线程安全问题方式一:同步代码块
Java多线程--解决单例模式中的懒汉式的线程安全问题
Java多线程--Thread类的常用结构及线程优先级