本帖最后由 朱晓杰 于 2013-4-17 17:07 编辑
这些天刚刚跟着毕老师窥探了一下多线程这个神秘的世界,自己动手编写了入学基础测试题的第十题(妈妈做饭的代码),运行结果正常,可是还有一些困惑,下面贴上我的代码:
package com.itheima;
public class Test10 {
/**
*第10题:模拟妈妈做饭,做饭时发现没有盐了,让儿子去买盐(假设买盐需要3分钟),只有盐买回来之后,妈妈才能继续做饭的过程。
*
* @author zhuxiaojie
*/
public static void main(String[] args){
Salt salt = new Salt();
Mother m = new Mother(salt);
Son s = new Son(salt);
Thread mother = new Thread(m);
Thread son = new Thread(s);
mother.start();
son.start();
//mother.setPriority(5); //mother.setPriority(1);
}
}
//共享资源:盐类
class Salt{
boolean flag = false;
}
//妈妈类
class Mother implements Runnable{
private Salt salt;
public Mother(Salt salt){
this.salt = salt;
}
public void run() {
while(true){
synchronized(salt){
if(!salt.flag){
System.out.println("Mother:儿子,没有盐了,你去买盐吧!");
salt.notify();//唤醒儿子去买盐
try {
salt.wait();//等待儿子把盐买回来
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
System.out.println("Mother:做饭中...儿子,待会就能吃饭了!");
System.out.println();
try {
Thread.sleep(1*60*1000);//做饭需要时间
} catch (InterruptedException e) {
e.printStackTrace();
}
salt.flag = false;//改变盐的状态:没盐
}
}
}
}
}
//儿子类
class Son implements Runnable{
private Salt salt;
public Son(Salt salt){
this.salt = salt;
}
public void run() {
while(true){
synchronized(salt){
if(!salt.flag){
System.out.println("Son:妈妈,你等会,我现在就去买盐!");
try {
Thread.sleep(3*60*1000);//买盐需要三分钟
salt.flag = true;//改变盐的状态:有盐
System.out.println("Son:妈妈,盐买回来了,什么是否能吃饭啊?");
salt.notify();//唤醒妈妈继续做饭
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
salt.wait();//等待吃饭
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
困惑一:怎么才能让儿子吃上饭呢?每次儿子买回盐来之后,就又得去买盐!
困惑二:程序运行结果的第一次 总是儿子先去买盐,可是我想让妈妈先执行,后来我想到了设置线程的优先级,但是不管用,请问该怎么处理?线程的优先级什么时候使用?数字越大代表优先级越高?
困惑三:根据题目的需求,我的代码还能怎么优化呢?请各位多多指教!谢谢!
|