Java 多线程同步问题的探究(四、协作,互斥下的协作——Java多线程协作(wait、notify、notifyAll))
2010-05-14 00:00:00 来源:WEB开发网运行这个程序,看不到异常了。但是仔细观察结果,貌似只有一个线程被唤醒。利用jconsole等工具查看线程状态,发现的确还是有两个线程被阻塞的。这是为啥呢?
程序中使用了flag.notify()方法。只能是随机的唤醒一个线程。我们可以改用flag.notifyAll()方法。这样,所有被阻塞的线程都会被唤醒了。
最终代码请读者自己修改,这里不再赘述。
好了,亲爱的读者们,让我们回到开篇提到的汉堡店大赛问题当中去,来看一看厨师、服务生和顾客是怎么协作进行这个比赛的。
首先我们构造故事中的三个次要对象:汉堡包、存放汉堡包的容器、服务生
public class Waiter {//服务生,这是个配角,不需要属性。
}
class Hamberg {
//汉堡包
private int id;//汉堡编号
private String cookerid;//厨师编号
public Hamberg(int id, String cookerid){
this.id = id;
this.cookerid = cookerid;
System.out.println(this.toString()+"was made!");
}
@Override
public String toString() {
return "#"+id+" by "+cookerid;
}
}
class HambergFifo {
//汉堡包容器
List<Hamberg> hambergs = new ArrayList<Hamberg>();//借助ArrayList来存放汉堡包
int maxSize = 10;//指定容器容量
//放入汉堡
public <T extends Hamberg> void push(T t) {
hambergs.add(t);
}
//取出汉堡
public Hamberg pop() {
Hamberg h = hambergs.get(0);
hambergs.remove(0);
return h;
}
//判断容器是否为空
public boolean isEmpty() {
return hambergs.isEmpty();
}
//判断容器内汉堡的个数
public int size() {
return hambergs.size();
}
//返回容器的最大容量
public int getMaxSize() {
return this.maxSize;
}
}
更多精彩
赞助商链接