<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 閱讀(1974) 評論(1)  編輯  收藏

    評論

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

    兄弟,轉載的吧

    轉載請注明  回復  更多評論   


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


    網站導航:
     
    主站蜘蛛池模板: 亚洲女人18毛片水真多| 国产产在线精品亚洲AAVV| 女人18毛片免费观看| 一级中文字幕乱码免费| 亚洲综合男人的天堂色婷婷| 免费高清资源黄网站在线观看| 日韩少妇内射免费播放| 亚洲最大视频网站| 国产啪亚洲国产精品无码| 日日麻批免费40分钟日本的| 日本一区二区三区免费高清在线| 久久精品国产亚洲AV无码娇色| 国产男女猛烈无遮档免费视频网站| baoyu122.永久免费视频| 日韩亚洲不卡在线视频中文字幕在线观看 | 噼里啪啦电影在线观看免费高清| 亚洲一区免费在线观看| 久久久久亚洲AV成人网人人软件| 日本成年免费网站| 成人久久免费网站| 国产亚洲日韩在线a不卡| 亚洲六月丁香六月婷婷色伊人| 国产成人高清亚洲| 日韩精品视频免费网址| 色老头永久免费网站| 国产又黄又爽又大的免费视频| 欧美激情综合亚洲一二区| 亚洲精品午夜久久久伊人| 亚洲乱码一区二区三区在线观看| 国产色爽免费视频| 一二三四免费观看在线电影| 十九岁在线观看免费完整版电影| 女人裸身j部免费视频无遮挡| 亚洲中文字幕久久久一区| 亚洲一区二区三区四区在线观看| 国产午夜亚洲精品国产成人小说| 无码国模国产在线观看免费| 99re热免费精品视频观看 | 97av免费视频| 中文无码成人免费视频在线观看| 又黄又大的激情视频在线观看免费视频社区在线 |