java学习多线程中遇到的例子:做饭买盐问题
2013-06-17 11:30
453 查看
我在学习多线程的过程中,碰到了一个关于多线程的基础测试题,题目如下:
模拟妈妈做饭,做饭时发现没有盐了,让儿子去买盐(假设买盐需要3分钟),只有盐买回来之后,妈妈才能继续做饭的过程。
这道题目经过分析,我觉得可以通过以下思路来考虑。1、分析题目中出现的3个对象,妈妈、儿子、盐,我们可以将这三个对象分别写为一个类;2、妈妈和儿子的关系,可以对应消费者生产者模型,妈妈为消费者,儿子是生产者;3、可以采用等待唤醒机制;4、考虑实现多线程的两种常用方法,即:实现Runnable接口和继承Thread类。接下来是我的实现代码。
//定义一个盐类,默认盐没有了,flag=false
class salt
{
private boolean flag=false;
//获取盐的状态
public boolean getFlag()
{
return flag;
}
//改变盐的状态
public boolean changeFlag(boolean flag)
{
return this.flag=flag;
}
}
//定义mother类,通过实现Runnable接口实现多线程
class mother implements Runnable
{
private salt s;
//mother构造方法
public mother(salt s)
{
this.s=s;
}
//覆写run方法
public void run()
{
while(true)
{
//锁定s对象
synchronized(s)
{
//if判断,是否进行等待唤醒机制
if(!s.getFlag())
{
//第一步:妈妈发出消息:没盐了,给儿子发命令去买盐
System.out.println("儿子,没盐了,给你三分钟时间去买盐,等你回来............");
//唤醒儿子
s.notify();
try
{
s.wait(180000);
}catch(Exception e)
{
e.printStackTrace();
}
//第三步:儿子通知妈妈盐买回来后,妈妈继续做饭
System.out.println("3分钟后,盐买回来了,继续做饭..........");
//改变盐的状态为false
s.changeFlag(false);
}
}
}
}
}
//定义son类,实现Runnable接口
class son implements Runnable
{
private salt s;
//儿子的构造方法
public son(salt s)
{
this.s=s;
}
public void run()
{
while(true)
{
//锁定盐对象
synchronized(s)
{
if(!s.getFlag())
{
//第二步:儿子得到命令,去买盐
System.out.println("好的,我去买盐,3分钟后回来..........");
try
{
s.wait(180000);
}catch(Exception e)
{
e.printStackTrace();
}
//盐买回来了,改变盐的状态为true
s.changeFlag(true);
//唤醒mother
s.notify();
}
}
}
}
}
class cooking
{
public static void main(String[] args)
{
salt s=new salt();
//分别创建两个线程,执行对象run方法
new Thread(new mother(s)).start();
new Thread(new son(s)).start();
}
}
模拟妈妈做饭,做饭时发现没有盐了,让儿子去买盐(假设买盐需要3分钟),只有盐买回来之后,妈妈才能继续做饭的过程。
这道题目经过分析,我觉得可以通过以下思路来考虑。1、分析题目中出现的3个对象,妈妈、儿子、盐,我们可以将这三个对象分别写为一个类;2、妈妈和儿子的关系,可以对应消费者生产者模型,妈妈为消费者,儿子是生产者;3、可以采用等待唤醒机制;4、考虑实现多线程的两种常用方法,即:实现Runnable接口和继承Thread类。接下来是我的实现代码。
//定义一个盐类,默认盐没有了,flag=false
class salt
{
private boolean flag=false;
//获取盐的状态
public boolean getFlag()
{
return flag;
}
//改变盐的状态
public boolean changeFlag(boolean flag)
{
return this.flag=flag;
}
}
//定义mother类,通过实现Runnable接口实现多线程
class mother implements Runnable
{
private salt s;
//mother构造方法
public mother(salt s)
{
this.s=s;
}
//覆写run方法
public void run()
{
while(true)
{
//锁定s对象
synchronized(s)
{
//if判断,是否进行等待唤醒机制
if(!s.getFlag())
{
//第一步:妈妈发出消息:没盐了,给儿子发命令去买盐
System.out.println("儿子,没盐了,给你三分钟时间去买盐,等你回来............");
//唤醒儿子
s.notify();
try
{
s.wait(180000);
}catch(Exception e)
{
e.printStackTrace();
}
//第三步:儿子通知妈妈盐买回来后,妈妈继续做饭
System.out.println("3分钟后,盐买回来了,继续做饭..........");
//改变盐的状态为false
s.changeFlag(false);
}
}
}
}
}
//定义son类,实现Runnable接口
class son implements Runnable
{
private salt s;
//儿子的构造方法
public son(salt s)
{
this.s=s;
}
public void run()
{
while(true)
{
//锁定盐对象
synchronized(s)
{
if(!s.getFlag())
{
//第二步:儿子得到命令,去买盐
System.out.println("好的,我去买盐,3分钟后回来..........");
try
{
s.wait(180000);
}catch(Exception e)
{
e.printStackTrace();
}
//盐买回来了,改变盐的状态为true
s.changeFlag(true);
//唤醒mother
s.notify();
}
}
}
}
}
class cooking
{
public static void main(String[] args)
{
salt s=new salt();
//分别创建两个线程,执行对象run方法
new Thread(new mother(s)).start();
new Thread(new son(s)).start();
}
}
相关文章推荐
- Java中在学习多线程中遇到的问题
- Hive学习1_hive配置遇到的问题:Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%
- 当年第一次学习java多线程写的例子,从此多线程不再陌生
- JAVA学习之一——在DOS环境下编译遇到的问题及解决方法
- 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题
- 多线程(6): Java Threads例子的一个问题
- JAVA学习第二十五课(多线程(四))- 单例设计模式涉及的多线程问题
- 学习java遇到的小问题,javac和java的一点点使用
- JAVA学习第二十六课(多线程(五))- 多线程间的通信问题
- java 多线程经典例子——生产者与消费者的问题
- 学习安卓开发过程中遇到关于R.Java文件的问题
- JAVA多线程学习--哲学家就餐问题
- 学习java所遇到的问题与解决方案记录
- mahout学习过程中遇到java @Override问题
- 学习 java 各种Reference遇到的问题
- JAVA学习遇到问题之项目部署环境配置
- 我在学习Java时遇到的一些问题
- Java学习笔记45(多线程二:安全问题以及解决原理)
- Java多线程几个例子学习
- JAVA多线程学习--哲学家就餐问题