生產者消費者從低級到高級

 一、使用Lock來模擬生產消費

關鍵方法:lock()、await()、signalAll()、unlock()

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

/*
 題目:一個初始值爲0的變量,兩個線程對其交替操作,一個加一一個減一,來5輪
 */
public class ProdConsumer_LockDemo {

    public static void main(String[] args) {
        ShareData shareData = new ShareData();

        new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                shareData.increment();
            }
        },"生產線程").start();

        new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                shareData.decrement();
            }
        }, "消費線程").start();

    }
}


class ShareData{
    private int number=0;

    private Lock lock = new ReentrantLock();

    private Condition condition = lock.newCondition();

    public void increment(){
        lock.lock();
        try{
            //使用while防止虛假喚醒
            while (number != 0) {
                //等待,不能生產
                condition.await();
            }
            number ++;
            System.out.println(Thread.currentThread().getName()+"\t"+number);
            condition.signalAll();
        }catch (Exception e) {

        }finally {
            lock.unlock();
        }
    }

    public void decrement(){
        lock.lock();
        try{
            //使用while防止虛假喚醒
            while (number == 0) {
                //等待,不能生產
                condition.await();
            }
            number --;
            System.out.println(Thread.currentThread().getName()+"\t"+number);
            condition.signalAll();
        }catch (Exception e) {

        }finally {
            lock.unlock();
        }
    }


}

 

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