Lock+Condition機制實現生產者消費者模型

  • Lock裏的 new Condition()會產生一個新的Condition(等待隊列)對象
  • 利用Condition裏面的await()singnal等待和喚醒自己隊列的線程,不會喚醒不該喚醒的線程
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

class goods{
    private String name;
    private int count = 0;
    private int maxCount;
    public goods(int maxCount){
        this.maxCount = maxCount;
    }
    private Lock lock = new ReentrantLock();
    private Condition producer = lock.newCondition();
    private Condition consumer = lock.newCondition();
    public void Produce(String name){
        try {
            lock.lock();
            while (this.count == maxCount){
                System.out.println("商品數量已經達最大,等待消費者消費");
                producer.await();
            }
            this.name = name;
            System.out.println(Thread.currentThread().getName()+"生產"+(count++)+"商品");
            consumer.signalAll();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
    public void Consume(){
        try {
            lock.lock();
            while (this.count == 0){
                System.out.println("商品已經被消費完,等待生產");
                consumer.await();
            }
            System.out.println(Thread.currentThread().getName()+"消費"+(count--)+"商品");
            producer.signalAll();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
    }

    @Override
    public String toString() {
        return "goods{" +
                "name='" + name + '\'' +
                ", count=" + count +
                '}';
    }
}
class Producer implements Runnable{
    private goods good;
    public Producer(goods good){
        this.good = good;
    }
    @Override
    public void run() {
        while (true){
            this.good.Produce("anmuxi");
        }
    }
}
class Consumer implements Runnable{
    private goods good;
    public Consumer(goods good){
        this.good = good;
    }
    @Override
    public void run() {
       while (true){
            this.good.Consume();
        }
    }
}
public class produceConsum {
    public static void main(String[] args) {
        List<Thread> list = new ArrayList<>();
        goods good = new goods(10);
        Producer producer = new Producer(good);
        Consumer consumer = new Consumer(good);

        for (int i = 0;i < 2;i++){
            Thread thread = new Thread(producer,"生產"+i);
            list.add(thread);
        }
        for (int i = 0;i < 4;i++){
            Thread thread = new Thread(consumer,"消費"+i);
            list.add(thread);
        }
        for (Thread t:list) {
            t.start();
        }
    }
}

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