您的位置:首页 > 编程语言 > Java开发

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();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: