<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Java世界

    學習筆記

    常用鏈接

    統計

    積分與排名

    天籟村

    新華網

    雅虎

    最新評論

    多線程案例:生產者和消費者

    1.生產和消費的產品抽象類:
    public abstract class Product {
        public String name;
        public abstract String toString();
    }

    2.一個具體的產品類:

    public class AProduct extends Product {
        public AProduct(String name) {
            this.name = name;
            // TODO Auto-generated constructor stub
        }
        public String toString() {
            // TODO Auto-generated method stub
            return this.name;
        }
    }

    3.容器類(倉庫):

    import java.util.ArrayList;

    /*
     * 存放生產者和消費者的產品隊列
     * */

    public class Container {
        private ArrayList arrList = new ArrayList();
        private int LENGTH = 10;
        public boolean isFull() {
            return arrList.size()==LENGTH;
        }
        public boolean isEmpty() {
            return arrList.isEmpty();
        }

        /* 如果此處不加synchronized鎖,那么也可以再調用push的地方加鎖
        * 既然此處加了鎖,那么再別的地方可以不加鎖
        */

        public synchronized void push(Object o) {
            arrList.add(o);
        }
        // 如果此處不加synchronized鎖,那么也可以再調用push的地方加鎖
        public synchronized Object pop() {
            Object lastOne = arrList.get(arrList.size()- 1);
            arrList.remove(arrList.size()- 1);
            return lastOne;
        }
    }

    4.休息一會,生產者和消費者都要休息,因此作為抽象基類:

    public abstract class Sleep {
        public void haveASleep() throws InterruptedException {
            Thread.sleep((long)(Math.random()* 3000));
        }
    }

    /*
     * 消費者線程
     * */

    public class Consumer extends Sleep implements Runnable {
        private Container contain =null;
        public Consumer(Container contain) {
            this.contain = contain;
        }
        public void run() {
            // TODO Auto-generated method stub
            while(true) {
                synchronized(contain) {
                    while(contain.isEmpty()) {
                        try{
                            contain.wait();
                        }catch(InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }
                consume();//消費
                try {
                    haveASleep();
                }catch(InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                synchronized(contain) {
                    contain.notify();
                }
            }
        }
        private void consume() {
            Product a = (AProduct)contain.pop();
            System.out.println("消費了一個產品"+ a.toString());
        }
    }

    /*
     * 生產者線程
     * */

    public class Producator extends Sleep implements Runnable {
        private Container contain = null;
        public Producator(Container contain) {
            super();
            this.contain = contain;
        }
        public void run() {
            // TODO Auto-generated method stub
            while(true) {
                synchronized(contain) {
                    while(contain.isFull()) {
                        try{
                            contain.wait();// 阻塞當前線程,當前線程進入等待隊列。這個時候只有等待別的線程來喚醒自己了。
                        }catch(InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }
                producer();// 生產一個產品
                try {
                    haveASleep();
                }catch(InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                synchronized(contain) {
                    contain.notify();// 喚醒等待隊列中正在等待的第一個線程,讓其執行。
                }
            }
        }
        public void producer() {
            Product aProduct = new AProduct("pp:"+String.valueOf((int)(10*Math.random())));
            System.out.println("生產了一個產品:"+ aProduct.toString());
            contain.push(aProduct);
        }
    }

    5. 寫一個測試:

    public class TestMain {
        /**
         * @param args
         */

        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Container contain = new Container();
            Producator p = new Producator(contain);
            Consumer c = new Consumer(contain);
            Thread pt =new Thread(p);
            Thread ct =new Thread(c);
            pt.start();
            ct.start();
        }
    }

    posted on 2007-11-06 09:39 Rabbit 閱讀(1976) 評論(1)  編輯  收藏

    評論

    # re: 多線程案例:生產者和消費者 2007-12-14 01:30 殤傷吾雁

    兄弟,轉載的吧

    轉載請注明  回復  更多評論   


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲人成电影网站免费| 永久免费无码网站在线观看个| 欧美日韩国产免费一区二区三区 | 亚洲精品一级无码中文字幕| 久青草视频在线观看免费| 亚洲高清视频在线观看| 一二三四在线观看免费高清中文在线观看| 亚洲AV无码成人精品区日韩| 亚洲乱码无码永久不卡在线| 亚洲三级高清免费| 一个人看的www免费视频在线观看| 亚洲视频在线观看免费视频| 国产在线观看免费视频播放器| 中国国产高清免费av片| 中文字幕乱码亚洲精品一区| 国产综合亚洲专区在线| 国产情侣激情在线视频免费看| jzzjzz免费观看大片免费| 亚洲a级在线观看| 国产成人亚洲精品91专区手机| 男女超爽刺激视频免费播放| 黄色短视频免费看| 亚洲精品宾馆在线精品酒店| 国产l精品国产亚洲区在线观看| 精品免费国产一区二区| 97在线视频免费| 一个人看的www免费在线视频| 亚洲videosbestsex日本| 久久精品国产亚洲一区二区三区| 日韩毛片免费无码无毒视频观看| 在线播放免费人成毛片乱码| 日韩欧美亚洲中文乱码| 亚洲精品国产情侣av在线| 在线成人爽a毛片免费软件| 美女黄色毛片免费看| 亚洲欧洲日产国产最新| 亚洲精品无码永久中文字幕| 高清在线亚洲精品国产二区| 免费无码AV片在线观看软件| 一区二区三区四区免费视频| 亚欧乱色国产精品免费视频|