真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Java怎么用阻塞隊列控制線程通信

這篇文章主要講解了“Java怎么用阻塞隊列控制線程通信”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java怎么用阻塞隊列控制線程通信”吧!

創(chuàng)新互聯(lián)專注于企業(yè)成都全網(wǎng)營銷推廣、網(wǎng)站重做改版、遠安網(wǎng)站定制設(shè)計、自適應品牌網(wǎng)站建設(shè)、H5場景定制、商城網(wǎng)站開發(fā)、集團公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應式網(wǎng)頁設(shè)計等建站業(yè)務,價格優(yōu)惠性價比高,為遠安等各大城市提供網(wǎng)站開發(fā)制作服務。

一 點睛

阻塞隊列主要用在生產(chǎn)者/消費者的場景,下面這幅圖展示了一個線程生產(chǎn)、一個線程消費的場景:

負責生產(chǎn)的線程不斷的制造新對象并插入到阻塞隊列中,直到達到這個隊列的上限值。隊列達到上限值之后生產(chǎn)線程將會被阻塞,直到消費的線程對這個隊列進行消費。同理,負責消費的線程不斷的從隊列中消費對象,直到這個隊列為空,當隊列為空時,消費線程將會被阻塞,除非隊列中有新的對象被插入。

BlockingQueue的核心方法:

方法\行為

拋異常

特定的值

阻塞

超時

插入方法

add(o)

offer(o)

put(o)

offer(o, timeout, timeunit)

移除方法

poll(),remove(o)

take()

poll(timeout, timeunit)

獲取、不刪除元素

element()

peek()

行為解釋:

1.拋異常:如果操作不能馬上進行,則拋出異常。

2. 特定的值:如果操作不能馬上進行,將會返回一個特殊的值,一般是true或者false。

3. 阻塞:如果操作不能馬上進行,操作會被阻塞。

4. 超時:如果操作不能馬上進行,操作會被阻塞指定的時間,如果指定時間沒執(zhí)行,則返回一個特殊值,一般是true或者false。

插入方法:

add(E e) : 添加成功返回true,失敗拋IllegalStateException異常。  offer(E e) : 成功返回 true,如果此隊列已滿,則返回 false。  put(E e) :將元素插入此隊列的尾部,如果該隊列已滿,則一直阻塞。

刪除方法:

remove(Object o) :移除指定元素,成功返回true,失敗返回false。  poll() : 獲取并移除此隊列的頭元素,若隊列為空,則返回 null。  take():獲取并移除此隊列頭元素,若沒有元素則一直阻塞。

獲取、不刪除元素:

element() :獲取但不移除此隊列的頭元素,沒有元素則拋異常。  peek() :獲取但不移除此隊列的頭;若隊列為空,則返回 null。

二 實戰(zhàn)1

1 代碼

import java.util.concurrent.*;public class BlockingQueueTest{   public static void main(String[] args)      throws Exception   {      // 定義一個長度為2的阻塞隊列      BlockingQueue bq = new ArrayBlockingQueue<>(2);      bq.put("Java"); // 與bq.add("Java"、bq.offer("Java")相同      bq.put("Java"); // 與bq.add("Java"、bq.offer("Java")相同      System.out.println("打印1");      bq.put("Java"); // ① 阻塞線程。      System.out.println("打印2");   }}

2 運行

打印1

三 實戰(zhàn)2

1 代碼

import java.util.concurrent.*;public class BlockingQueueTest{   public static void main(String[] args)      throws Exception   {      // 定義一個長度為2的阻塞隊列      BlockingQueue bq = new ArrayBlockingQueue<>(2);      bq.put("Java"); // 與bq.add("Java"、bq.offer("Java")相同      bq.put("Java"); // 與bq.add("Java"、bq.offer("Java")相同      System.out.println("打印1");      //bq.put("Java"); // ① 阻塞線程。      System.out.println("打印2");   }}

2 運行

打印1打印2

四 實戰(zhàn)3

1 代碼

import java.util.concurrent.*;class Producer extends Thread{   private BlockingQueue bq;   public Producer(BlockingQueue bq)   {      this.bq = bq;   }   public void run()   {      String[] strArr = new String[]      {        "Java",        "Struts",        "Spring"      };      for (int i = 0 ; i < 5 ; i++ )      {        System.out.println(getName() + "生產(chǎn)者準備生產(chǎn)集合元素!");        try        {           Thread.sleep(200);           // 嘗試放入元素,如果隊列已滿,線程被阻塞           bq.put(strArr[i % 3]);        }        catch (Exception ex){ex.printStackTrace();}        System.out.println(getName() + "生產(chǎn)完成:" + bq);      }   }}class Consumer extends Thread{   private BlockingQueue bq;   public Consumer(BlockingQueue bq)   {      this.bq = bq;   }   public void run()   {      while(true)      {        System.out.println(getName() + "消費者準備消費集合元素!");        try        {           Thread.sleep(200);           // 嘗試取出元素,如果隊列已空,線程被阻塞           bq.take();        }        catch (Exception ex){ex.printStackTrace();}        System.out.println(getName() + "消費完成:" + bq);      }   }}public class BlockingQueueTest2{   public static void main(String[] args)   {      // 創(chuàng)建一個容量為1的BlockingQueue      BlockingQueue bq = new ArrayBlockingQueue<>(1);      // 啟動3條生產(chǎn)者線程      new Producer(bq).start();      new Producer(bq).start();      new Producer(bq).start();      // 啟動一條消費者線程      new Consumer(bq).start();   }}

2 運行

Thread-1生產(chǎn)者準備生產(chǎn)集合元素!Thread-2生產(chǎn)者準備生產(chǎn)集合元素!Thread-0生產(chǎn)者準備生產(chǎn)集合元素!Thread-3消費者準備消費集合元素!Thread-0生產(chǎn)完成:[Java]Thread-0生產(chǎn)者準備生產(chǎn)集合元素!Thread-3消費完成:[]Thread-2生產(chǎn)完成:[Java]Thread-2生產(chǎn)者準備生產(chǎn)集合元素!Thread-3消費者準備消費集合元素!Thread-3消費完成:[Struts]Thread-3消費者準備消費集合元素!Thread-2生產(chǎn)完成:[Struts]Thread-2生產(chǎn)者準備生產(chǎn)集合元素!Thread-3消費完成:[]Thread-0生產(chǎn)完成:[Struts]Thread-3消費者準備消費集合元素!Thread-0生產(chǎn)者準備生產(chǎn)集合元素!Thread-3消費完成:[Java]Thread-3消費者準備消費集合元素!Thread-1生產(chǎn)完成:[Java]Thread-1生產(chǎn)者準備生產(chǎn)集合元素!Thread-3消費完成:[]Thread-2生產(chǎn)完成:[Spring]Thread-2生產(chǎn)者準備生產(chǎn)集合元素!Thread-3消費者準備消費集合元素!Thread-3消費完成:[Java]Thread-3消費者準備消費集合元素!Thread-2生產(chǎn)完成:[Java]Thread-2生產(chǎn)者準備生產(chǎn)集合元素!Thread-3消費完成:[]Thread-1生產(chǎn)完成:[Struts]Thread-3消費者準備消費集合元素!Thread-1生產(chǎn)者準備生產(chǎn)集合元素!Thread-3消費完成:[Spring]Thread-3消費者準備消費集合元素!Thread-1生產(chǎn)完成:[Spring]Thread-1生產(chǎn)者準備生產(chǎn)集合元素!Thread-3消費完成:[]Thread-3消費者準備消費集合元素!Thread-2生產(chǎn)完成:[Struts]Thread-3消費完成:[]Thread-0生產(chǎn)完成:[Spring]Thread-0生產(chǎn)者準備生產(chǎn)集合元素!Thread-3消費者準備消費集合元素!Thread-1生產(chǎn)完成:[Java]Thread-1生產(chǎn)者準備生產(chǎn)集合元素!Thread-3消費完成:[Java]Thread-3消費者準備消費集合元素!Thread-3消費完成:[]Thread-0生產(chǎn)完成:[Java]Thread-0生產(chǎn)者準備生產(chǎn)集合元素!Thread-3消費者準備消費集合元素!Thread-3消費完成:[]Thread-3消費者準備消費集合元素!Thread-0生產(chǎn)完成:[Struts]Thread-3消費完成:[]Thread-3消費者準備消費集合元素!Thread-1生產(chǎn)完成:[Struts]Thread-3消費完成:[]Thread-3消費者準備消費集合元素!

感謝各位的閱讀,以上就是“Java怎么用阻塞隊列控制線程通信”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對Java怎么用阻塞隊列控制線程通信這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!


文章標題:Java怎么用阻塞隊列控制線程通信
鏈接URL:http://weahome.cn/article/gggdgo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部