<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 殤傷吾雁

    兄弟,轉載的吧

    轉載請注明  回復  更多評論   


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


    網站導航:
     
    主站蜘蛛池模板: 亚洲激情视频图片| 日本免费一区二区久久人人澡| 亚洲国产精久久久久久久| 成人无遮挡毛片免费看| 久久久久久影院久久久久免费精品国产小说 | 免费A级毛片无码无遮挡内射| 狠狠躁狠狠爱免费视频无码| 杨幂最新免费特级毛片| 亚洲欧洲春色校园另类小说| 亚洲国产精品VA在线看黑人| 亚洲精品老司机在线观看| 成人性生活免费视频| 99爱在线精品免费观看| 全免费a级毛片免费看| 国产一级一毛免费黄片| 日韩一区二区三区免费播放| 久久久久久亚洲精品无码| 亚洲情A成黄在线观看动漫软件 | 无遮挡国产高潮视频免费观看 | h片在线免费观看| 三年片在线观看免费观看大全动漫| 精品免费久久久久国产一区 | 成人激情免费视频| 99久久久国产精品免费无卡顿| 小日子的在线观看免费| 你懂的免费在线观看| 国产va免费精品| 一区二区三区免费视频网站| 午夜不卡AV免费| 九九视频高清视频免费观看| 特级毛片全部免费播放a一级| 国产大陆亚洲精品国产| 国产亚洲精品无码成人| 国产AⅤ无码专区亚洲AV| 国产综合亚洲专区在线| 国产成人亚洲综合无码精品| 亚洲AV无码一区二区二三区入口| 亚洲AV无码乱码国产麻豆| 亚洲成A人片777777| 337p日本欧洲亚洲大胆艺术| 亚洲理论片在线中文字幕|