WEB开发网
开发学院软件开发Java Java 多线程同步问题的探究(四、协作,互斥下的协... 阅读

Java 多线程同步问题的探究(四、协作,互斥下的协作——Java多线程协作(wait、notify、notifyAll))

 2010-05-14 00:00:00 来源:WEB开发网   
核心提示: 运行这个程序,看不到异常了,Java 多线程同步问题的探究(四、协作,互斥下的协作——Java多线程协作(wait、notify、notifyAll))(4),但是仔细观察结果,貌似只有一个线程被唤醒,首先我们构造故事中的三个次要对象:汉堡包、存放汉堡包的容器、服务生publicclassWai

运行这个程序,看不到异常了。但是仔细观察结果,貌似只有一个线程被唤醒。利用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;
        }
    }

上一页  1 2 3 4 5 6 7 8  下一页

Tags:Java 线程 同步

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接