java 併發包 Lock Condition實現阻塞佇列
阿新 • • 發佈:2018-11-13
import java.util.LinkedList; import java.util.List; import java.util.Random; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class LockConditionTest { public static void main(String[] args) { MyQueue<String> queue = new MyQueue<>(5); while(true){ try { Thread.sleep(0); } catch (InterruptedException e) { e.printStackTrace(); } new Thread(()->{ String s = queue.get(); System.out.println("傳送訊息:"+s); }).start(); new Thread(()->{ String set = new Random().nextInt()*1000+""; queue.put(set); System.out.println("儲存訊息:"+set); }).start(); System.out.println("對列長度:"+queue.getCount()); } } static class MyQueue<OBJ>{ private final int total;//最大長度 private List<OBJ> list; //對列 private Lock lock = new ReentrantLock(); //鎖 private Condition notFull = lock.newCondition();//不滿 private Condition notEmpty = lock.newCondition(); //不為空 public MyQueue(int total){ this.total = total; list = new LinkedList<>(); } public int getCount(){ return this.list.size(); } public void put(OBJ obj){ lock.lock(); try{ //如果滿了,則阻塞 if(list.size() >= total){ try { System.out.println("滿了,等待發送"); this.notFull.await(); } catch (InterruptedException e) { e.printStackTrace(); } } list.add(obj); //不為空喚醒 notEmpty.signal(); }finally { lock.unlock(); } } public OBJ get(){ lock.lock(); try{ if(list.isEmpty()){ try { System.out.println("沒有資訊了,等待注入"); notEmpty.await(); } catch (InterruptedException e) { e.printStackTrace(); } } OBJ obj = list.remove(0); notFull.signal(); return obj; }finally { lock.unlock(); } } } }