日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

JAVA 的BlockingQueue接口, java.util.concurrent.BlockingQueue, 代表著一個隊列可以安全的插入和取元素.換句話說,多線程通過BlockingQueue安全的插入或者取元素,不會有任何并發問題發生。

BlockingQueue用法

BlockingQueue典型的應用是一個生產者多個消費者,下面一張圖描述了其原理:

 

JAVA多線程-BlockingQueue

一個線程放入元素到BlockingQueue,其他線程從中取元素

生產者不斷的生產新對象并且加到隊列BlockingQueue中,直到隊列加滿,也就是說如果隊列滿了,那么生產者就會一直阻塞,直到消費者取出元素。

消費者不斷的從BlockingQueue 中取元素,如果隊列為空,那么一直阻塞直到生產者往隊列中加入元素。

BlockingQueue的方法

BlockingQueue接口中分別有4種方法不同的插入和移除元素的方法,已經兩種檢查元素的方法。如果請求的操作無法執行,則每組方法的行為不同。

下面的表格是4種方法:

JAVA多線程-BlockingQueue

 

下面是4種方法的解釋:

Throws Exception:

嘗試操作失敗,則會拋出異常

Special Value:

嘗試操作,成功會返回true或者失敗返回false

Blocks:

如果不能立馬操作,則會阻塞,直到可以操作

Times Out:

嘗試操作,如果不能立馬操作,則會在指定的時間內返回成功true或者失敗false.

不能在BlockingQueue中加入null,否則會拋NullPointerException。

可以訪問BlockingQueue中的所有元素,而不僅僅是頭和尾。例如,假設您已將一個對象排隊等待處理,但您的應用程序決定取消它。然后可以調用remove(o)來刪除隊列中的特定對象。但是,這并不是很有效,所以除非您真的需要,否則不應該使用這些 Collection方法.

BlockingQueue的實現:

BlockingQueue是個接口,所以需要用它的實現類, java.util.concurrent 包下實現了BlockingQueue的類:

ArrayBlockingQueue

DelayQueue

LinkedBlockingQueue

PriorityBlockingQueue

SynchronousQueue

這些實現類我們后面會一一講解。

BlockingQueue的簡單例子:

這兒用了 BlockingQueue 的實現類ArrayBlockingQueue .

首先在BlockingQueueExample 分別啟動生產者和消費者線程,生產者往BlockingQueue 中插入String元素,消費者從中取出。

public class BlockingQueueExample {
 
    public static void main(String[] args) throws Exception {
 
        BlockingQueue queue = new ArrayBlockingQueue(1024);
 
        Producer producer = new Producer(queue);
        Consumer consumer = new Consumer(queue);
 
        new Thread(producer).start();
        new Thread(consumer).start();
 
        Thread.sleep(4000);
    }
}

 

這是生產者類,注意每次put()之前都休眠了1s,這回使得消費者阻塞,等待往隊列里面加入元素:

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(1000);
            queue.put("2");
            Thread.sleep(1000);
            queue.put("3");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

 

這是消費者類,就是從隊列中取元素打印:.

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

分享到:
標簽:JAVA BlockingQueue
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定