package com.study; import java.util.Random; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class BlockingQueueDemo { public static void main(String[] args) { BlockingQueueDemo blockingQueueDemo = new BlockingQueueDemo(); final BlockingQueueClass blockingQueueClass = blockingQueueDemo.new BlockingQueueClass(); Thread thread = new Thread(new Runnable() { @Override public void run() { while(true){ int value = new Random().nextInt(); System.out.println("準備存數據了"); blockingQueueClass.put(value); System.out.println("已經存好數據了"); } } }); thread.start(); Thread thread2 = new Thread(new Runnable() { @Override public void run() { while(true){ System.out.println("準備取數據了"); Object value = blockingQueueClass.take(); System.out.println("取到的數據爲:" + value); } } }); thread2.start(); } class BlockingQueueClass{ Lock lock = new ReentrantLock(); Condition notFullCondition = lock.newCondition(); Condition notEmptyCondition = lock.newCondition(); Object[] items = new Object[100]; private int putLength,takeLength,count; public void put(Object object){ lock.lock(); try { while(count == items.length){ try { notFullCondition.await(); } catch (InterruptedException error) { error.printStackTrace(); } } items[putLength] = object; if(++putLength == items.length){ putLength = 0; } ++count; notEmptyCondition.signal(); } catch (Exception e) { e.printStackTrace(); } finally{ lock.unlock(); } } public Object take(){ Object object = new Object(); lock.lock(); try { while(count == 0){ try { notEmptyCondition.await(); } catch (InterruptedException e) { e.printStackTrace(); } } object = items[takeLength]; if(++takeLength == items.length){ takeLength = 0; } --count; notFullCondition.signal(); } catch (Exception e) { e.printStackTrace(); lock.unlock(); } return object; } } }