關於Java中Queue和BlockingQueue的區別

隊列是一種特殊的線性表,它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作。進行插入操作的端稱爲隊尾,進行刪除操作的端稱爲隊頭。隊列中沒有元素時,稱爲空隊列。下面小編準備了關於Java中Queue和BlockingQueue的區別,提供給大家參考!

關於Java中Queue和BlockingQueue的區別

kingQueue:支持兩個附加操作的 Queue,這兩個操作是:檢索元素時等待隊列變爲非空,以及存儲元素時等待空間變得可用。

kingQueue 不接受 null 元素。

kingQueue 可以是限定容量的'。

kingQueue 實現是線程安全的。Queue不是線程安全的。因此可以將Blockingqueue用於用於生產者-使用者隊列。

根據Api修改的一個例子,大家可以修改自己體驗BlockingQueue的使用

package test;

import yBlockingQueue;

import kingQueue;

/**

* 生產者

*/

class Producer implements Runnable {

private final BlockingQueue queue;

Producer(BlockingQueue q) {

queue = q;

}

public void run() {

try {

for (int i = 0; i < 3; i++) {

(produce());

tln("生產後:"+());

}

} catch (InterruptedException ex) {

tStackTrace();

}

}

Character produce() {

char c = (char) (om() * 26 + 'A');

tln("生產前:" + c);

return c;

}

}

/**

* 消費者

*/

class Consumer implements Runnable {

private final BlockingQueue queue;

Consumer(BlockingQueue q) {

queue = q;

}

public void run() {

try {

while (true) {

consume(());

//p(100);

}

} catch (InterruptedException ex) {

tStackTrace();

}

}

void consume(Character c) {

tln("消費:" + c);

}

}

/**

* 一個生產者、兩個消費者

*

*/

class Setup {

public static void main(String[] args) {

BlockingQueue q = new ArrayBlockingQueue(1);

Producer p = new Producer(q);

Consumer c1 = new Consumer(q);

Consumer c2 = new Consumer(q);

new Thread(p)t();

new Thread(c1)t();

new Thread(c2)t();

}

}

–EOF–