多線程編程四-生產消費模型

目錄

1 定義生產者

2 定義消費者

3 定義admin接口

4 SynchronizedAdmin實現

5 ReentrantLockAdmin實現

6 測試程序


本次生產消費模型分別用synchronized和ReentrantLock實現
思路:分爲4部分,主程序、生產銷售管理,生產者線程,消費者線程。
生產銷售管理中有商品數組,當前庫存量,生產線方法,消費方法,分別在生產者和消費者run函數調用
主程序創建管理系統對象,初始化生產者,消費者,啓動線程。

1 定義生產者

class Generator implements Runnable {
    private Admin admin;
    public Generator(Admin admin) {
        this.admin  =  admin;
    }
    public void run() {
        for(int i = 1; i<= 25; i ++) {
            String good = "商品" + i;
            admin.generate(good);
        }
    }
}

2 定義消費者

class Consumer implements Runnable {
    private Admin admin = null;
    public Consumer(Admin admin) {
        this.admin  =  admin;
    }
    public void run() {
        for(int i = 1; i<= 25; i ++) {
            admin.consume();
        }
    }
}

3 定義admin接口

interface Admin {
    String[] GOODS = new String[6];
    
    public void generate(String good);
    
    public void consume();
}

4 SynchronizedAdmin實現

class SynchronizedAdmin implements Admin{
    private int goodNum = 0;
    {
        System.out.println("測試SynchronizedAdmin");
    }
    //同步鎖實現同步,同步監視器調用wait、notify方法實現通信
    public synchronized void generate(String good) {
        try {
            if(goodNum == GOODS.length) {
                //讓出線程,釋放資源
                this.wait();
            }
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        GOODS[goodNum] = good;
        goodNum ++;
        System.out.println("生產線正在生產第" + goodNum + "個商品,商品名是:" + GOODS[goodNum - 1]);
        //喚醒當前對象池中等待的一個線程。
        this.notify();
    }
    public synchronized void consume() {
        try {
            if(goodNum == 0) {
                // 讓出線程,釋放資源
                this.wait();
            }
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("正在消費第" + goodNum + "個商品,商品名是:" + GOODS[goodNum - 1]);
        goodNum--;
        //喚醒當前對象池中等待的一個線程。
        this.notify();
    }
}

5 ReentrantLockAdmin實現

class ReentrantLockAdmin implements Admin {
    private int goodNum = 0;
    private Lock lock = new ReentrantLock();
    private Condition condition = lock.newCondition();
    {
        System.out.println("測試ReentrantLockAdmin");
    }
    //重入鎖實現同步,condition的await、signal實現通信
    public void generate(String good) {
        lock.lock();
        try {
            if(goodNum == GOODS.length) {
                // 讓出線程,釋放資源
                condition.await();
            }
            Thread.sleep(100);
            GOODS[goodNum] = good;
            goodNum ++;
            System.out.println("生產線正在生產第" + goodNum + "個商品,商品名是:" + GOODS[goodNum - 1]);
            //喚醒當前對象池中等待的一個線程。
            condition.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally{
            lock.unlock();
        }        
    }
    public void consume() {
        lock.lock();
        try {
            if(goodNum == 0) {
                //讓出線程,釋放資源
                condition.await();
            }
            Thread.sleep(100);
            System.out.println("正在消費第" + goodNum + "個商品,商品名是:" + GOODS[goodNum - 1]);
            goodNum --;
            //喚醒當前對象池中等待的一個線程。
            condition.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally{
            lock.unlock();
        }
    }
}

6 測試程序

public static void main(String[] args) {
    //測試同步鎖管理系統
    //Admin admin = new SynchronizedAdmin();
    //測試重入鎖管理系統
    Admin admin = new ReentrantLockAdmin();
    Generator generator = new Generator(admin);
    Thread thr1 = new Thread(generator);
    Consumer con = new Consumer(admin);
    Thread thr2 = new Thread(con);
    thr1.start();
    thr2.start();
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章