中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用BlockingQueue怎么實現阻塞隊列

發布時間:2021-06-18 15:25:31 來源:億速云 閱讀:259 作者:Leah 欄目:大數據

這篇文章將為大家詳細講解有關使用BlockingQueue怎么實現阻塞隊列,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

使用BlockingQueue怎么實現阻塞隊列

使用BlockingQueue怎么實現阻塞隊列

使用BlockingQueue怎么實現阻塞隊列

使用BlockingQueue怎么實現阻塞隊列

使用BlockingQueue怎么實現阻塞隊列

package com.shi.queue;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;

/**
 * 阻塞隊列
 * @author shiye
 *
 */
public class TestBlockQueue {

	public static void main(String[] args) throws InterruptedException {
		//定義一個長度為3的阻塞隊列
		BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);
		
		System.out.println("----------------拋出異常的 情況----------------------");
//		blockingQueue.add("aa");
//		blockingQueue.add("bb");
//		blockingQueue.add("cc");
		//blockingQueue.add("dd");//如果隊列滿了 Exception java.lang.IllegalStateException: Queue full
		
//		System.out.println(blockingQueue.element());//檢查隊列頭的信息 : aa
		
//		blockingQueue.remove();
//		blockingQueue.remove();
//		blockingQueue.remove();
		//blockingQueue.remove();//如果隊列為空 Exception java.util.NoSuchElementException
		
		//System.out.println(blockingQueue.element());//如果隊列為空  Exception java.util.NoSuchElementException
		
		System.out.println("----------------返回true/false----------------------");
//		System.out.println(blockingQueue.offer("11"));//插入隊列	true
//		System.out.println(blockingQueue.offer("22"));//插入隊列	true
//		System.out.println(blockingQueue.offer("33"));//插入隊列	true
//		System.out.println(blockingQueue.offer("44"));//插入隊列	false
//		
//		System.out.println(blockingQueue.peek());//檢查隊列頭元素  11
//		
//		System.out.println(blockingQueue.poll());//輸出隊列	11
//		System.out.println(blockingQueue.poll());//輸出隊列	22
//		System.out.println(blockingQueue.poll());//輸出隊列	33
//		System.out.println(blockingQueue.poll());//輸出隊列	null
		
		System.out.println("----------------隊列阻塞等待----------------------");
//		blockingQueue.put("zhangsan");
//		blockingQueue.put("lisi");
//		blockingQueue.put("wangwu");
//		//blockingQueue.put("shiye");//線程一直等待無法關閉
//		
//		blockingQueue.take();
//		blockingQueue.take();
//		blockingQueue.take();
		//blockingQueue.take();//線程一直等待  無法響應
		
		System.out.println("----------------隊列等待一定時間之后就退出----------------------");
		System.out.println(blockingQueue.offer("aa", 2, TimeUnit.SECONDS));//true
		System.out.println(blockingQueue.offer("aa", 2, TimeUnit.SECONDS));//true
		System.out.println(blockingQueue.offer("aa", 2, TimeUnit.SECONDS));//true
		System.out.println(blockingQueue.offer("aa", 2, TimeUnit.SECONDS));//false 等待2s鐘之后就退出
		
		
	}

}

SynchronousQueue

package com.shi.queue;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.SynchronousQueue;

/**
 * 不存儲數據的隊列,即生產一個消費一個的隊列
 * @author shiye
 *
 *結果:
	AA	 存放1 ...
	BB	 get 1
	AA	 存放2 ...
	BB	 get 2
	AA	 存放3 ...
	BB	 get 3
 */
public class TestSynchroniousQueue {

	public static void main(String[] args) {
		BlockingQueue<String> blockingQueue = new SynchronousQueue<>();
		
		new Thread(()-> {
			try {
				System.out.println(Thread.currentThread().getName()+ "\t 存放1 ..." );
				blockingQueue.put("1");
				
				System.out.println(Thread.currentThread().getName()+ "\t 存放2 ..." );
				blockingQueue.put("2");
				
				System.out.println(Thread.currentThread().getName()+ "\t 存放3 ..." );
				blockingQueue.put("3");
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		},"AA").start();
		
		
		new Thread(()-> {
			try {
				Thread.sleep(5000);//睡眠5秒
				System.out.println(Thread.currentThread().getName() + "\t get " + blockingQueue.take());
			
				Thread.sleep(5000);//睡眠5秒
				System.out.println(Thread.currentThread().getName() + "\t get " + blockingQueue.take());
				
				Thread.sleep(5000);//睡眠5秒
				System.out.println(Thread.currentThread().getName() + "\t get " + blockingQueue.take());

			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		},"BB").start();
		
	}

}

綜合案例(使用阻塞隊列實現生產者消費者問題)

package com.shi.queue;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 	通過阻塞隊列的方式 實現  生產者 消費者 問題
 * @author shiye
 *	使用到的技術:
 *	countDownLatch:閉鎖
 *	volatile 自旋鎖
 *	AtomicInteger 原子整型
 *	BlockingQueue 阻塞隊列
 *	
 */
public class TestProducterAndConsumterByQueue {

	public static void main(String[] args) throws InterruptedException {
		
		//閉鎖
		final CountDownLatch countDownLatch = new CountDownLatch(11);
		
		Check check = new Check(new ArrayBlockingQueue<>(3));
		
		//創建線程生產 (啟動10個線程去生產)
		for (int i = 0; i < 10; i++) {
			new Thread(()->{
				System.out.println(Thread.currentThread().getName() + "\t 生產者啟動...");
				try {
					check.productor("aaa");
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				countDownLatch.countDown();//線程數量減一
			},"AA-"+i).start();
		}
		
		
		
		//創建1 個線程消費
		new Thread(()->{
			System.out.println(Thread.currentThread().getName() + "\t 消費者啟動...");
			try {
				check.consumter();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			countDownLatch.countDown();//線程數量減一
		},"BB").start();
		
		Thread.sleep(5000);//等待5秒 停止
		check.stop();
		
		countDownLatch.await();//等待上面的線程全部執行完畢,才檢查產品數量
		System.out.println("5s之后線程停止,總共生產了:"+ check.getTotle() +"件產品");
	}

}

//店員
class Check{
	private volatile boolean FLAG = true;//標志位
	private AtomicInteger atomicInteger = new AtomicInteger();//統計總數的變量
	
	private BlockingQueue<Object> blockingQueue = null;//定義一個阻塞隊列
	
	public Check(BlockingQueue<Object> blockingQueue) {
		this.blockingQueue = blockingQueue;
		System.out.println("創建一個 "+blockingQueue.getClass().getName()+" 實例");
	}
	
	//生產者
	public void productor(String num) throws InterruptedException {
		while(FLAG) {
			System.out.println( Thread.currentThread().getName() + "\t 生產者生產數據:" + num + "到隊列中...");
			blockingQueue.offer(num,2l,TimeUnit.SECONDS); //延遲2s插入數據到隊列中。。
			Thread.sleep(1000);//線程睡眠1s
			atomicInteger.getAndIncrement();//讓總數自加1
		}
	}
	
	//消費者
	public void consumter() throws InterruptedException {
		while(FLAG) {
			Object object = blockingQueue.poll(2, TimeUnit.SECONDS);//最多消費延遲2s
			if(object != null) {
				System.out.println( Thread.currentThread().getName() + "\t 消費者消費數據:" + object);
			}
		}
	}
	
	//停止
	public void stop() {
		FLAG = false;
	}
	
	public int getTotle() {
		return atomicInteger.get();
	}
}

關于使用BlockingQueue怎么實現阻塞隊列就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

乐都县| 三穗县| 惠东县| 灌阳县| 洛隆县| 松溪县| 兴化市| 札达县| 莱阳市| 加查县| 九龙城区| 万宁市| 宽甸| 河北区| 呼玛县| 贡嘎县| 民勤县| 德令哈市| 平定县| 泰宁县| 襄樊市| 清丰县| 阳东县| 台山市| 成武县| 鄂尔多斯市| 贺州市| 土默特左旗| 河曲县| 罗江县| 阜阳市| 大荔县| 铅山县| 湟源县| 塔河县| 梅州市| 正宁县| 柳河县| 四会市| 景泰县| 卓资县|