JAVA多線程(8):線程通信Condition實現生產者和消費者

一、線程通信Condition

基於Lock鎖的線程通信,可以通過Condition對象實現。Condition對象可以通過lock.newCondition()生成。
線程通信方法await、signal和signalAll,是和sychronized的通信方法wait,notify和notifyAll一一對應。

二、實現代碼實例

參考:https://blog.csdn.net/u010886217/article/details/104941864
1.注意修改代碼Clerk類

package com.Java.BaseUse.juc.ProAndCon_SychronizedImp_multi_condition;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 店員
 * 修改使用lock顯示鎖,並使用condition通信
 */
class Clerk{
    private int product=0;

    private Lock lock=new ReentrantLock();

    //lock的線程通信
    Condition condition=lock.newCondition();

    //進貨
    public void get(){

        lock.lock();
        try {
            while(product>=1){
                System.out.println("產品已滿!");
                try {
//                    this.wait();
                    condition.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

//        else{
//            System.out.println(Thread.currentThread().getName()+":"+ ++product);
//            this.notifyAll();
//        }
            System.out.println(Thread.currentThread().getName()+":"+ ++product);
//            this.notifyAll();
            condition.signalAll();
        }finally {
            lock.unlock();
        }

    }

    //賣貨
    public void sale(){
        lock.lock();
        try {
            while (product<=0){
                System.out.println("產品已沒有了!");
                try {
//                    this.wait();
                    condition.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
//        else {
//            System.out.println(Thread.currentThread().getName()+":"+ --product);
//            this.notifyAll();
//        }
            System.out.println(Thread.currentThread().getName()+":"+ --product);
//            this.notifyAll();
            condition.signalAll();
        }finally {
            lock.unlock();
        }
    }
}

2.測試類運行結果

產品已沒有了!
產品已沒有了!
生產者A:1
消費者B:0
產品已沒有了!
產品已沒有了!
生產者C:1
消費者B:0
產品已沒有了!
產品已沒有了!
生產者A:1
消費者B:0
產品已沒有了!
產品已沒有了!
生產者C:1
消費者B:0
產品已沒有了!
產品已沒有了!
生產者A:1
消費者B:0
產品已沒有了!
產品已沒有了!
生產者C:1
消費者B:0
產品已沒有了!
產品已沒有了!
生產者A:1
消費者B:0
產品已沒有了!
產品已沒有了!
生產者C:1
消費者B:0
產品已沒有了!
產品已沒有了!
生產者A:1
消費者B:0
產品已沒有了!
產品已沒有了!
生產者C:1
消費者B:0
產品已沒有了!
產品已沒有了!
生產者A:1
消費者B:0
產品已沒有了!
產品已沒有了!
生產者C:1
消費者B:0
產品已沒有了!
產品已沒有了!
生產者A:1
消費者B:0
產品已沒有了!
產品已沒有了!
生產者C:1
消費者B:0
產品已沒有了!
產品已沒有了!
生產者A:1
消費者B:0
產品已沒有了!
產品已沒有了!
生產者C:1
消費者B:0
產品已沒有了!
產品已沒有了!
生產者A:1
消費者B:0
產品已沒有了!
產品已沒有了!
生產者C:1
消費者B:0
產品已沒有了!
產品已沒有了!
生產者A:1
消費者B:0
產品已沒有了!
產品已沒有了!
生產者C:1
消費者B:0
產品已沒有了!
產品已沒有了!
生產者A:1
消費者B:0
產品已沒有了!
生產者C:1
消費者D:0
產品已沒有了!
生產者A:1
消費者D:0
產品已沒有了!
生產者C:1
消費者D:0
產品已沒有了!
生產者A:1
消費者D:0
產品已沒有了!
生產者C:1
消費者D:0
產品已沒有了!
生產者A:1
消費者D:0
產品已沒有了!
生產者C:1
消費者D:0
產品已沒有了!
生產者A:1
消費者D:0
產品已沒有了!
生產者C:1
消費者D:0
產品已沒有了!
生產者A:1
消費者D:0
產品已沒有了!
生產者C:1
消費者D:0
產品已沒有了!
生產者A:1
消費者D:0
產品已沒有了!
生產者C:1
消費者D:0
產品已沒有了!
生產者A:1
消費者D:0
產品已沒有了!
生產者C:1
消費者D:0
產品已沒有了!
生產者A:1
消費者D:0
產品已沒有了!
生產者C:1
消費者D:0
產品已沒有了!
生產者A:1
消費者D:0
產品已沒有了!
生產者C:1
消費者D:0
產品已沒有了!
生產者A:1
消費者D:0
產品已沒有了!
生產者C:1
消費者D:0

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