1. 程式人生 > >Java ReEntrantLock 之 Condition條件(Java代碼實戰-002)

Java ReEntrantLock 之 Condition條件(Java代碼實戰-002)

AD set int not tran port code finall 消費者

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

/**
 * ConditionTest
 * 一個測試類,用Condition實現的生產者消費者問題
 */
public class ConditionTest {
    /* 定義一個容器(鏈表、隊列) */
    private LinkedList<String> buffer;
    
/* 容器可以容納元素的最大數量,通過構造函數來初始化 */ private int maxSize; private Lock lock; private Condition fullCondition; private Condition notFullCondition; ConditionTest(int maxSize) { this.maxSize = maxSize; buffer = new LinkedList<String>(); lock = new ReentrantLock(); fullCondition
= lock.newCondition(); notFullCondition = lock.newCondition(); } /** * 向容器中放入Element */ public void set(String string) throws InterruptedException { // 獲取鎖 lock.lock(); try { while (maxSize == buffer.size()) { // 滿了,添加的線程進入等待狀態
notFullCondition.await(); } buffer.add(string); // 容器不為空時,則給等待的讀取的線程發送信號以便喚醒這些線程進行讀取 fullCondition.signal(); } finally { lock.unlock(); } } /** * 從容器中獲取Element */ public String get() throws InterruptedException { String string; lock.lock(); try { while (buffer.size() == 0) { // 如果容器為空,則讀取的線程進入等待狀態 fullCondition.await(); } string = buffer.poll(); // 給寫入的線程發送信號以便喚醒這些線程來往容器中寫入 notFullCondition.signal(); } finally { lock.unlock(); } return string; } }

Java ReEntrantLock 之 Condition條件(Java代碼實戰-002)