国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

JAVA生產(chǎn)者消費者(線程同步)代碼學習示例

2019-11-26 15:53:22
字體:
來源:轉載
供稿:網(wǎng)友

一、問題描述

生產(chǎn)者消費者問題是一個典型的線程同步問題。生產(chǎn)者生產(chǎn)商品放到容器中,容器有一定的容量(只能順序放,先放后拿),消費者消費商品,當容器滿了后,生產(chǎn)者等待,當容器為空時,消費者等待。當生產(chǎn)者將商品放入容器后,通知消費者;當消費者拿走商品后,通知生產(chǎn)者。

二、解決方案

對容器資源加鎖,當取得鎖后,才能對互斥資源進行操作。

復制代碼 代碼如下:

public class ProducerConsumerTest {

    public static void main(String []args){
        Container con = new Container();
        Producer p = new Producer(con);
        Consumer c = new Consumer(con);
        new Thread(p).start();
        new Thread(c).start();
    }

}


class Goods{
    int id;
    public Goods(int id){
        this.id=id;
    }

    public String toString(){
        return "商品"+this.id;
    }
}

class Container{//容器采用棧,先進后出
    private int index = 0;
    Goods[] goods = new Goods[6];

    public synchronized void push(Goods good){
        while(index==goods.length){//當容器滿了,生產(chǎn)者等待
            try {
                wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        goods[index]=good;
        index++;
        notifyAll();//當生產(chǎn)者放入商品后通知消費者
    }

    public synchronized Goods pop(){
        while(index==0){//當容器內沒有商品是等待
            try {
                wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        index--;
        notifyAll();//當消費者消費了商品后通知生產(chǎn)者
        return goods[index];
    }
}

class Producer implements Runnable{

    Container con = new Container();
    public Producer(Container con){
        this.con=con;
    }

    public void run(){
        for(int i=0; i<20; i++){
            Goods good = new Goods(i);
            con.push(good);
            System.out.println("生產(chǎn)了:"+good);
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

}

class Consumer implements Runnable{

    Container con = new Container();
    public Consumer(Container con){
        this.con=con;
    }

    public void run(){
        for(int i=0; i<20; i++){
            Goods good=con.pop();
            System.out.println("消費了:"+good);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

   
}

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 东乡族自治县| 剑川县| 西和县| 抚宁县| 恩施市| 普宁市| 互助| 酉阳| 昂仁县| 会昌县| 日土县| 奉节县| 乌兰县| 肃宁县| 二连浩特市| 鸡泽县| 高州市| 海盐县| 晋城| 九寨沟县| 中宁县| 博乐市| 新余市| 抚顺市| 富蕴县| 桐乡市| 黄浦区| 桃源县| 汉阴县| 石狮市| 武城县| 方城县| 绩溪县| 清徐县| 滨海县| 长丰县| 桃园县| 古蔺县| 海晏县| 蓬溪县| 兴国县|