Java多線程簡單樣例(二):使用lock鎖的生產者消費者問題



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

/**
 * 生產者消費者模式
 * @author fliay
 *
 */
public class TestProductorAndConsumerByLock {

    public static void main(String[] args) {
        ClerkByLock c = new ClerkByLock();
        ProductorByLock pro = new ProductorByLock(c);
        ConsumerByLock con = new ConsumerByLock(c);
        new Thread(pro,"生產者A").start();
        new Thread(con,"消費者B").start();
        new Thread(pro,"生產者C").start();
        new Thread(con,"消費者D").start();
    }
    
    
    

}

class  ClerkByLock{
    //初始化產品
    private int product = 0;
    //定義一個Lock鎖對象
    private Lock lock = new ReentrantLock();
    //創建condition對象
    private Condition condition = lock.newCondition();
    
    
    //進貨
    public  void get(){
        lock.lock();
        
        try{
            while(product>=10){
                System.out.println("產品已滿!");
                try {
                    //使用condition進行線程等待
                    condition.await();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            condition.signalAll();
            System.out.println(Thread.currentThread().getName()+":"+ ++product);
        }finally{
            //始終會解鎖
            lock.unlock();
        }
        
        
        
        
    }
    
    //賣貨
    public  void sale(){
        lock.lock();
        try{
            
            while(product<=0){
                System.out.println("補貨中!");
                try {
                    condition.await();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            condition.signalAll();
            System.out.println(Thread.currentThread().getName()+":"+ --product);
        }finally{
            lock.unlock();
        }
        
        
    }
}

class ProductorByLock implements Runnable{
    
    private ClerkByLock clerk;
    
    
    public ProductorByLock(ClerkByLock clerk) {
        this.clerk = clerk;
    }



    public void run() {
        for(int i=0;i<20;i++){
            clerk.get();
        }
    }
}


class ConsumerByLock implements Runnable{
    
    private ClerkByLock clerk;
    
    
    
    public ConsumerByLock(ClerkByLock clerk) {
        this.clerk = clerk;
    }



    public void run() {
        for(int i=0;i<20;i++){
            clerk.sale();
        }
    }
}

運行結果如下:

生產者A:1
消費者B:0
補貨中!
生產者C:1
生產者C:2
生產者C:3
生產者C:4
生產者C:5
生產者C:6
生產者C:7
生產者C:8
生產者C:9
消費者D:8
消費者D:7
消費者D:6
消費者D:5
消費者D:4
消費者D:3
消費者D:2
消費者D:1
消費者D:0
補貨中!
生產者A:1
生產者A:2
生產者A:3
生產者A:4
生產者A:5
生產者A:6
生產者A:7
生產者A:8
生產者A:9
生產者A:10
產品已滿!
消費者B:9
消費者B:8
消費者B:7
消費者B:6
消費者B:5
消費者B:4
消費者B:3
消費者B:2
消費者B:1
消費者B:0
補貨中!
生產者C:1
生產者C:2
生產者C:3
生產者C:4
生產者C:5
生產者C:6
生產者C:7
生產者C:8
生產者C:9
生產者C:10
產品已滿!
消費者D:9
消費者D:8
消費者D:7
消費者D:6
消費者D:5
消費者D:4
消費者D:3
消費者D:2
消費者D:1
消費者D:0
補貨中!
生產者A:1
生產者A:2
生產者A:3
生產者A:4
生產者A:5
生產者A:6
生產者A:7
生產者A:8
生產者A:9
消費者B:8
消費者B:7
消費者B:6
消費者B:5
消費者B:4
消費者B:3
消費者B:2
消費者B:1
消費者B:0
生產者C:1
消費者D:0

 

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