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

您的位置:首頁技術文章
文章詳情頁

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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();} }}

下面的代碼是消費者類Consumer,它從隊列中獲取待處理的元素對象,并調(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();} }}

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

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

標簽: Java
相關文章:
主站蜘蛛池模板: 国语自产偷拍精品视频偷最新 | a4yy欧美一区二区三区 | 97精品国产自在现线免费 | 伊人天天 | 亚洲精品午夜级久久久久 | 亚洲码在线观看 | 中国一及黄色片 | 国产一级黄色片子 | 国产图片区 | 国产视频一二三区 | 国产福利一区二区在线观看 | 日本一级特黄刺激爽大片 | 欧美性一区 | 免费看麻豆视频 | 在线观看日本免费视频大片 | 黄色特级一级片 | 57pao一国产成永久免费 | 激情在线日韩视频免费 | 草草视频免费在线观看 | 爱爱小视频在线观看网站 | 天天色综合影视 | 国产精品1024免费看 | 久久国产精品老女人 | www在线观看视频 | 国产精品一区在线麻豆 | 成人午夜免费视频免费看 | a级在线 | 色片免费| 黄色链接在线观看 | 欧美做a一级视频免费观看 欧美做a欧美 | 综合久久 五十路 二区 | 黄色特级一级片 | 亚洲+自拍+色综合图区一 | 成 人 免 费 黄 色 | 在线观看国产高清免费不卡黄 | 国产精品性 | 国产男女视频在线观看 | 麻豆一区二区三区在线观看 | 尤物视频免费观看 | 欧美三j片 | 一级特黄高清完整大片 |