国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

使用多線程模擬隊列實現

2019-11-06 06:36:08
字體:
來源:轉載
供稿:網友
import java.util.LinkedList;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicInteger;public class MyQueue {		//1 需要一個承裝元素的集合 	PRivate LinkedList<Object> list = new LinkedList<Object>();		//2 需要一個計數器	private AtomicInteger count = new AtomicInteger(0);		//3 需要制定上限和下限	private final int minSize = 0;		private final int maxSize ;		//4 構造方法	public MyQueue(int size){		this.maxSize = size;	}		//5 初始化一個對象 用于加鎖	private final Object lock = new Object();			//put(anObject): 把anObject加到BlockingQueue里,如果BlockQueue沒有空間,則調用此方法的線程被阻斷,直到BlockingQueue里面有空間再繼續.	public void put(Object obj){		synchronized (lock) {			while(count.get() == this.maxSize){				try {					lock.wait();				} catch (InterruptedException e) {					e.printStackTrace();				}			}			//1 加入元素			list.add(obj);			//2 計數器累加			count.incrementAndGet();			//3 通知另外一個線程(喚醒)			lock.notify();			System.out.println("新加入的元素為:" + obj);		}	}			//take: 取走BlockingQueue里排在首位的對象,若BlockingQueue為空,阻斷進入等待狀態直到BlockingQueue有新的數據被加入.	public Object take(){		Object ret = null;		synchronized (lock) {			while(count.get() == this.minSize){				try {					lock.wait();				} catch (InterruptedException e) {					e.printStackTrace();				}			}			//1 做移除元素操作			ret = list.removeFirst();			//2 計數器遞減			count.decrementAndGet();			//3 喚醒另外一個線程			lock.notify();		}		return ret;	}		public int getSize(){		return this.count.get();	}			public static void main(String[] args) {				final MyQueue mq = new MyQueue(5);		mq.put("a");		mq.put("b");		mq.put("c");		mq.put("d");		mq.put("e");				System.out.println("當前容器的長度:" + mq.getSize());				Thread t1 = new Thread(new Runnable() {			@Override			public void run() {				mq.put("f");				mq.put("g");			}		},"t1");				t1.start();										try {			TimeUnit.SECONDS.sleep(3);		} catch (InterruptedException e) {			e.printStackTrace();		}				Thread t2 = new Thread(new Runnable() {			@Override			public void run() {				Object o1 = mq.take();				System.out.println("移除的元素為:" + o1);				Object o2 = mq.take();				System.out.println("移除的元素為:" + o2);			}		},"t2");				t2.start();					}			}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 库尔勒市| 鸡东县| 衡阳县| 宜兴市| 吴江市| 勃利县| 贵南县| 成都市| 镇雄县| 长乐市| 栖霞市| 沛县| 德昌县| 信阳市| 伊金霍洛旗| 柞水县| 甘洛县| 石门县| 彩票| 通山县| 报价| 尤溪县| 会昌县| 泾源县| 临洮县| 安平县| 潍坊市| 黑龙江省| 新余市| 英山县| 灵川县| 涟源市| 襄樊市| 梁山县| 凤城市| 泸西县| 榆社县| 常山县| 宜都市| 钦州市| 合肥市|