1. 程式人生 > >Java 學習筆記 使用並發包ReentrantLock簡化生產者消費者模式代碼

Java 學習筆記 使用並發包ReentrantLock簡化生產者消費者模式代碼

stack true tar ons 實現 one 們的 vat ren

說明

ReentrantLock是java官方的一個線程鎖類,ReentarntLock實現了Lock的接口
我們只需要使用這個,就可以不用使用synchronized同步關鍵字以及對應的notifyall方法和wait方法去寫我們的生產者消費者模式。
這樣就可以大大簡化我們的代碼

代碼

Producer.java

package producterandcustomer;

import java.util.List;
import java.util.concurrent.locks.Lock;

/**
 * @author StarsOne
 * @date Create in  2019-4-13 0013 14:51:21
 * @description
 */
class Producter extends Thread {
    List<Object> warehouse;
    private String name;
    Lock lock;

    public Producter(List<Object> warehouse, String name, Lock lock) {
        this.warehouse = warehouse;
        this.name = "生產者" + name;
        //多態,ReentarntLock實現了Lock的接口,所以可以傳進來
        this.lock = lock;

    }

    @Override
    public void run() {
        while (true) {
            //加鎖
            lock.lock();
            try {
                if (warehouse.size() < 10) {
                    warehouse.add(new Object());
                    System.out.println(name + "生產1件" + "當前倉庫有" + warehouse.size() + "件");
                }
            } finally {
                //解鎖
                lock.unlock();
            }

            try {
                sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

Consumer.java

package producterandcustomer;

import java.util.List;
import java.util.concurrent.locks.Lock;

/**
 * @author StarsOne
 * @date Create in  2019-4-13 0013 14:51:21
 * @description
 */
class Cuotmer extends Thread{
    List<Object> warehouse;
    private String name;
    Lock lock;

    public Cuotmer(List<Object> warehouse, String name, Lock lock) {
        this.warehouse = warehouse;
        this.name = "消費者"+name;
        this.lock = lock;
    }

    @Override
    public void run() {
        while (true) {
            //加鎖
            lock.lock();
            try {
                if (warehouse.size() > 0) {
                    warehouse.remove(0);
                    System.out.println(name+"消費1件"+"當前倉庫有"+warehouse.size()+"件");
                }
            }finally {
                //最後釋放
                lock.unlock();
            }

            try {
                sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

Test.java

package producterandcustomer;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @author StarsOne
 * @date Create in  2019-4-13 0013 14:57:26
 * @description
 */
class Test {
    public static void main(String[] args) {
        List<Object> warehouse = new ArrayList<>();
        Lock lock = new ReentrantLock();
        new Cuotmer(warehouse, "小米", lock).start();
        new Cuotmer(warehouse, "小藍", lock).start();
        new Cuotmer(warehouse, "小浩", lock).start();
        new Cuotmer(warehouse, "小家", lock).start();
        new Cuotmer(warehouse, "小留", lock).start();

        new Producter(warehouse, "小一", lock).start();
        new Producter(warehouse, "小二", lock).start();
        new Producter(warehouse, "小香", lock).start();
        new Producter(warehouse, "小叫", lock).start();
        new Producter(warehouse, "小三", lock).start();


    }
}

Java 學習筆記 使用並發包ReentrantLock簡化生產者消費者模式代碼