亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

java并發(fā)編程工具類JUC之ArrayBlockingQueue

瀏覽:2日期:2022-08-11 15:01:50

Java BlockingQueue接口java.util.concurrent.BlockingQueue表示一個(gè)可以存取元素,并且線程安全的隊(duì)列。換句話說,當(dāng)多線程同時(shí)從 JavaBlockingQueue中插入元素、獲取元素的時(shí)候,不會導(dǎo)致任何并發(fā)問題(元素被插入多次、處理多次等問題)。

從java BlockingQueue可以引申出一個(gè)概念:阻塞隊(duì)列,是指隊(duì)列本身可以阻塞線程向隊(duì)列里面插入元素,或者阻塞線程從隊(duì)列里面獲取元素。比如:當(dāng)一個(gè)線程嘗試去從一個(gè)空隊(duì)列里面獲取元素的時(shí)候,這個(gè)線程將被阻塞直到隊(duì)列內(nèi)元素?cái)?shù)量不再為空。當(dāng)然,線程是否會被阻塞取決于你調(diào)用什么方法從BlockingQueue獲取元素,有的方法會阻塞線程,有的方法會拋出異常等等,下文我們會詳細(xì)介紹。

類ArrayBlockingQueue是BlockingQueue接口的實(shí)現(xiàn)類,它是有界的阻塞隊(duì)列,內(nèi)部使用數(shù)組存儲隊(duì)列元素。這里的“有界”是指存儲容量存在上限,不能無限存儲元素。在同一時(shí)間內(nèi)存儲容量存在著一個(gè)上限值,這個(gè)上限制在初始實(shí)例化的時(shí)候指定,之后便不能修改了。

ArrayBlockingQueue內(nèi)部采用FIFO (First In, First Out)先進(jìn)先出的方法實(shí)現(xiàn)隊(duì)列數(shù)據(jù)的存取,隊(duì)首的元素是在隊(duì)列中保存時(shí)間最長的元素對象,隊(duì)尾的元素是在隊(duì)列中保存時(shí)間最短的元素對象。

下面的代碼說明如何初始化一個(gè)ArrayBlockingQueue,并向其中添加一個(gè)對象:

BlockingQueue queue = new ArrayBlockingQueue(1024);queue.put('1'); //向隊(duì)列中添加元素Object object = queue.take(); //從隊(duì)列中取出元素

BlockingQueue可以通過泛型來限定隊(duì)列中存儲數(shù)據(jù)的類型,下面的代碼以String為泛型,表示該隊(duì)列只能存儲String類型。

BlockingQueue<String> queue = new ArrayBlockingQueue<String>(1024);queue.put('1');String string = queue.take();實(shí)現(xiàn)一個(gè)生產(chǎn)消費(fèi)的實(shí)例

在前面的文章中我們曾經(jīng)講過:BlockingQueue經(jīng)常被用于生產(chǎn)消費(fèi)的緩沖隊(duì)列。下面我們就使用ArrayBlockingQueue來真正的實(shí)現(xiàn)一個(gè)生產(chǎn)消費(fèi)的例子。

類BlockingQueueExample開啟兩個(gè)獨(dú)立線程,一個(gè)是Producer生產(chǎn)者線程,負(fù)責(zé)向隊(duì)列中添加數(shù)據(jù);另一個(gè)是Consumer消費(fèi)者線程,負(fù)責(zé)從隊(duì)列中取出數(shù)據(jù)進(jìn)行處理。

public class BlockingQueueExample { public static void main(String[] args) throws Exception {//使用ArrayBlockingQueue初始化一個(gè)BlockingQueue,指定容量的上限為1024BlockingQueue queue = new ArrayBlockingQueue(1024);Producer producer = new Producer(queue); //生產(chǎn)者Consumer consumer = new Consumer(queue); //消費(fèi)者new Thread(producer).start(); //開啟生產(chǎn)者線程new Thread(consumer).start(); //開啟消費(fèi)者線程Thread.sleep(4000); }}

類Producer為生產(chǎn)者,每隔10秒鐘使用put()方法向隊(duì)列中放入一個(gè)對象,放入三次。在這10秒的間隔內(nèi),隊(duì)列數(shù)據(jù)被消費(fèi)者取走之后將導(dǎo)致消費(fèi)者線程阻塞。

public class Producer implements Runnable{ protected BlockingQueue queue = null; public Producer(BlockingQueue queue) {this.queue = queue; } public void run() {try { queue.put('1'); Thread.sleep(10000); queue.put('2'); Thread.sleep(10000); queue.put('3');} catch (InterruptedException e) { e.printStackTrace();} }}

下面的代碼是消費(fèi)者類Consumer,它從隊(duì)列中獲取待處理的元素對象,并調(diào)用System.out將其打印出來。

public class Consumer implements Runnable{ protected BlockingQueue queue = null; public Consumer(BlockingQueue queue) {this.queue = queue; } public void run() {try { System.out.println(queue.take()); System.out.println(queue.take()); System.out.println(queue.take());} catch (InterruptedException e) { e.printStackTrace();} }}

上面的代碼打印結(jié)果是每隔10秒打印一次,因?yàn)槠渲衪ake()方法在隊(duì)列內(nèi)沒有元素可以取到的時(shí)候,會阻塞當(dāng)前的消費(fèi)者線程,讓其處于等待狀態(tài),這個(gè)方法我們在上一節(jié)介紹BlockingQueue的時(shí)候就已經(jīng)進(jìn)行過說明。

以上就是java并發(fā)編程工具類JUC之ArrayBlockingQueue的詳細(xì)內(nèi)容,更多關(guān)于java并發(fā)編程工具類ArrayBlockingQueue的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 成人免费xxx色视频 成人免费短视频 | 性视频网站在线 | 国内精品一区二区三区αv 国内精品一区二区三区东京 | 精品三级在线 | 性xxxxxxx动漫视频 | 二级特黄绝大片免费视频大片 | 日韩一级视频免费观看 | 国产亚洲精品一区二区 | 国产成人亚洲综合无 | 国产日韩欧美精品一区 | 欧美日韩国产高清 | 亚洲无线码一区二区三区在线观看 | 中文字幕永久在线视频 | 这里只有精品99re在线 | 国产精品久久久亚洲第一牛牛 | 色播亚洲精品网站 亚洲第一 | a级毛片无码免费真人 | 国产精品v欧美精品∨日韩 国产精品www | 一起色色 | 亚洲大成色www永久网址 | 久久欧美精品欧美九久欧美 | 国产成人短视频在线观看免费 | 欧美一区二区三区不卡视频 | 四虎现在的网址入口2022 | 国产一级毛片夜一级毛片 | 国产精品夜色视频一区二区 | 成人黄色片视频 | 黄色片视频免费 | 欧美日韩小视频 | 亚洲综合图区 | 1024国产精品视频观看 | 男女爱爱视频在线观看 | 8x成人在线 | 婷婷丁香在线观看 | 水果污视频 | 996免费视频国产在线播放 | 亚洲精品色综合色在线观看 | 伊人午夜 | 久久夜色tv网站免费影院 | 久热99这里只有精品视频6 | 在线免费看影视网站入口 |