`
周凡杨
  • 浏览: 234527 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

多线程编程之卫生间

阅读更多

如大家所知,火车上车厢的卫生间很小,每次只能容纳一个人,一个车厢只有一个卫生间,这个卫生间会被多个人同时使用,在实际使用时,当一个人进入卫生间时则会把卫生间锁上,等出来时打开门,下一个人进去把门锁上,如果有一个人在卫生间内部则别人的人发现门是锁的则只能在外面等待。

问题分析:首先问题中有两个实体,一个是人,一个是厕所,所以设计程序时就可以设计两个类。人是多数的,厕所只有一个(暂且模拟的是一个车厢)。人的行为是随机不定的,即随时可能要上厕所。从这里就可以看出设计类时,人要设计成线程类,这样才可以体现其行为随机不定,即可能并发的一起上厕所。

 

Java实现过程如下:

 package thread.washroom;
/**
 * 厕所、卫生间(这里描述的是火车上的厕所,每次只能供一人使用)
 * @author zhoufy
 */
public class Toilet {
	/**
	 * 厕所使用中
	 */
	public synchronized void useing(User user){
		System.out.println("有人进入厕所,使用者["+user.getUserInfo()+"]");
		try {
			Thread.sleep(100); //模拟厕所使用的平均时间
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println(user.getUsername()+"离开厕所......");
	}
}

 

  

package thread.washroom;

import org.apache.commons.lang.math.RandomUtils;

public class User implements Runnable{

	/**自身属性**/
	private String username;  //用户名
	private String sex;       //性别
	private int age;       //年龄
	
	/**附加属性**/
	private Toilet outToilet;
	
	/**
	 * 构造子函数 (相当人出生的时候,自身属性就开始有了)
	 */
	public User(String username, String sex, int age){
		this.username = username;
		this.sex = sex;
		this.age = age;
	}
	
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	
	public String getUserInfo(){
		return "姓名:"+username+", 性别:"+sex+", 年龄:"+age;
	}
	
	public void tell(Toilet t){
		outToilet = t;
	}
	
	@Override
	public void run() {
		try {
			Thread.sleep(RandomUtils.nextInt(100));
			if(outToilet!=null){ //找到了厕所
				outToilet.useing(this); //拉便便,要使用厕所
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

 

 

package thread.washroom;

public class Main {

	public static void main(String[] args){
		
		/**人是多数的,且行为不定,随时可能上厕所**/
		User user1 = new User("张三", "男", 22);
		User user2 = new User("小丽", "女", 26);
		User user3 = new User("周小舰", "男", 25);
		
		/**厕所只有1个,每次只能供1人使用**/
		Toilet t = new Toilet();
		
		user1.tell(t); //张三知道了厕所在哪
		user2.tell(t); //小丽知道了厕所在哪
		user3.tell(t); //周小舰知道了厕所在哪
		
		new Thread(user1).start();
		new Thread(user2).start();
		new Thread(user3).start();
		
	}
	
}

 

 

运行结果:

有人进入厕所,使用者[姓名:小丽, 性别:女, 年龄:26]

小丽离开厕所......

有人进入厕所,使用者[姓名:张三, 性别:男, 年龄:22]

张三离开厕所......

有人进入厕所,使用者[姓名:周小舰, 性别:男, 年龄:25]

周小舰离开厕所......

 

 

 

说明:

代码中使用synchronized关键字将厕所这个临界资源锁定,当结束时,释放锁定,从而实现了排序上厕所的结果。

 

试想如果去掉synchronized关键字,结果是什么呢?

 

运行结果:

有人进入厕所,使用者[姓名:周小舰, 性别:男, 年龄:25]

有人进入厕所,使用者[姓名:小丽, 性别:女, 年龄:26]

有人进入厕所,使用者[姓名:张三, 性别:男, 年龄:22]

周小舰离开厕所......

小丽离开厕所......

张三离开厕所......

 

场面太美,我也是醉了……

 

 

 

 

参考资料:

http://www.cnblogs.com/springcsc/archive/2009/12/03/1616394.html

 

 

7
3
分享到:
评论
6 楼 周凡杨 2015-07-06  
liubey 写道
User 怎么会持有一个Toilet 呢

上厕所的时候暂时拥有
5 楼 liubey 2015-07-02  
User 怎么会持有一个Toilet 呢
4 楼 yangxiangbin 2015-07-02  
  
3 楼 cywhoyi 2015-07-02  
假设张三是去抽烟、男女厕所是否可以分开
2 楼 Morton90 2015-07-02  
   
1 楼 kingcs 2015-07-01  
有点意思,写的很好   

相关推荐

    Linux下C语言多线程编程实例

    Linux 下 C 语言多线程编程实例 Linux 下的多线程编程是一种非常重要的技术,在实际应用中有非常广泛的应用范围。多线程编程可以大大提高程序的执行效率和响应速度。但是,多线程编程也存在一些复杂性,例如线程...

    C#多线程编程实例实战.pdf

    C#多线程编程实例实战 C#多线程编程实例实战是指在C#语言中实现多线程编程的实例和实战经验。多线程编程是指在同一个进程中创建多个线程,以便提高程序的执行效率和响应速度。在C#语言中,可以使用Thread类和线程池...

    Linux下的多线程编程.pdf

    多线程编程的优点之一是它是一种非常“节俭”的多任务操作方式。与进程相比,多线程的优点之一是它可以节约系统资源,一个进程的开销大约是一个线程开销的30倍左右。另外,多线程之间的通信机制也非常方便,多个线程...

    C++多线程编程.pdf

    C++多线程编程

    JAVA多线程编程技术PDF

    在Java编程领域,多线程是一项至关重要的技术,它允许程序同时执行多个任务,从而提高系统资源的利用率和程序的响应速度。这份“JAVA多线程编程技术PDF”是学习和掌握这一领域的经典资料,涵盖了多线程的全部知识点...

    Windows多线程编程技术与实例(C++)(PDF)

    《Windows多线程编程技术与实例(C++)》是一本深入探讨Windows环境下多线程编程的书籍,特别适合正在学习或已经从事C++多线程开发的人员阅读。本书通过丰富的实例,详细讲解了如何在Windows操作系统中利用C++进行...

    汪文君JAVA多线程编程实战(完整不加密)

    《汪文君JAVA多线程编程实战》是一本专注于Java多线程编程的实战教程,由知名讲师汪文君倾力打造。这本书旨在帮助Java开发者深入理解和熟练掌握多线程编程技术,提升软件开发的效率和质量。在Java平台中,多线程是...

    Java多线程编程实战指南(核心篇)

    Java多线程编程实战指南(核心篇) 高清pdf带目录 随着现代处理器的生产工艺从提升处理器主频频率转向多核化,即在一块芯片上集成多个处理器内核(Core),多核处理器(Multicore Processor)离我们越来越近了――如今...

    MFC多线程编程

    【MFC多线程编程】是Windows环境下使用Microsoft Foundation Class (MFC)库进行多线程应用程序开发的技术。MFC库是Visual C++提供的一种面向对象的类库,它简化了Windows API的使用,包括多线程编程。多线程在现代...

    linux多线程编程.pdf

    Linux多线程编程是现代操作系统编程的重要组成部分,尤其是在Linux环境下,多线程编程更是成为了高性能应用不可或缺的技术之一。本文档主要涉及Linux多线程编程的一些关键知识点,包括pthread线程库的使用、线程的...

    嵌入式软件开发技术:第5章 嵌入式Linux多线程编程.ppt

    嵌入式Linux多线程编程 嵌入式Linux多线程编程是嵌入式系统开发中的一种重要技术,能够提高系统的效率和响应速度。本章节将详细介绍嵌入式Linux多线程编程的基本概念、线程的创建、同步和互斥、线程属性、多线程...

    C++多线程编程入门教程

    C++多线程编程入门教程 本文将对C++多线程编程进行详细的介绍,从多线程概念的定义到实际的编程实现。同时,文章还将对Linux和Windows平台下的多线程实现进行比较,并提供了相关的示例代码。 一、多线程概念 在...

    多线程编程(完整版)

    多线程编程是一种重要的软件开发技术,特别是在处理并发任务、优化资源利用率和提高程序响应速度方面。通过创建多个线程,程序可以在同一进程中并行执行不同的任务,从而提高整体效率。 在操作系统层面,进程和线程...

    Linux系统下的多线程编程入门.pdf

    在Linux系统下进行多线程编程是开发高效并发应用程序的关键技术之一。本文将深入探讨Linux环境中的多线程概念、创建与管理线程的方法、线程同步与通信机制,以及多线程编程中可能遇到的问题和解决策略。 一、多线程...

    c++多线程编程的十个例子

    在C++编程中,多线程技术是一种强大的工具,它允许程序同时执行多个任务,从而提高了效率和响应性。以下是对“C++多线程编程的十个例子”的详细讲解,这些例子将帮助你在Windows环境下深入理解和应用多线程。 1. **...

    sun 多线程编程指南

    Sun Microsystems公司的《Sun多线程编程指南》是一本经典的多线程编程书籍,详细阐述了多线程编程的基础理论、API接口使用以及相关的编程技巧。 在标题《Sun多线程编程指南》中,关键词“Sun”指的是Sun ...

Global site tag (gtag.js) - Google Analytics