JAva concurrentのLinkedBlockingQueue
2655 ワード
JAva concurrentのLinkedBlockingQueue
リンクされたノードに基づいた任意の範囲のblocking queue.このキューは、FIFO(先頭に進む)で要素をソートします.キューのヘッダは、キュー内で最も時間がかかる要素です.キューの末尾は、キュー内で最も短い要素です.新しい要素がキューの末尾に挿入され、キュー取得操作によりキューの先頭にある要素が取得されます.リンク・キューのスループットは、通常、配列ベースのキューよりも高くなりますが、ほとんどのコンカレント・アプリケーションでは、予知可能なパフォーマンスが低下します.
オプションの容量範囲構築方法パラメータは、キューの過度な拡張を防止する方法の1つとして使用されます.容量が指定されていない場合はIntegerに等しい.MAX_VALUE.ノードを挿入するとキューが容量を超えない限り、挿入するたびにリンクノードが動的に作成されます.
take()pull()remove()offer()add()などの方法の違いを以下の例で試みることができる.
リンクされたノードに基づいた任意の範囲のblocking queue.このキューは、FIFO(先頭に進む)で要素をソートします.キューのヘッダは、キュー内で最も時間がかかる要素です.キューの末尾は、キュー内で最も短い要素です.新しい要素がキューの末尾に挿入され、キュー取得操作によりキューの先頭にある要素が取得されます.リンク・キューのスループットは、通常、配列ベースのキューよりも高くなりますが、ほとんどのコンカレント・アプリケーションでは、予知可能なパフォーマンスが低下します.
オプションの容量範囲構築方法パラメータは、キューの過度な拡張を防止する方法の1つとして使用されます.容量が指定されていない場合はIntegerに等しい.MAX_VALUE.ノードを挿入するとキューが容量を超えない限り、挿入するたびにリンクノードが動的に作成されます.
BlockingQueue unbounded = new LinkedBlockingQueue();
BlockingQueue bounded = new LinkedBlockingQueue(1024);
bounded.put("Value");
String value = bounded.take();
take()pull()remove()offer()add()などの方法の違いを以下の例で試みることができる.
package com.viashare.linkedblockingqueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
/**
* Created by Jeffy on 15/12/11.
*/
public class LinkedBlockingQueueMain {
public static void main(String[] args) throws InterruptedException {
LinkedBlockingQueue linkedBlockingQueue = new LinkedBlockingQueue<>(2);
new Thread(new ProducerTask(linkedBlockingQueue)).start();
new Thread(new ConsumerTask(linkedBlockingQueue)).start();
Thread.currentThread().sleep(10000);
System.err.println("finished");
}
static class ProducerTask implements Runnable {
private BlockingQueue queue;
public ProducerTask(BlockingQueue queue) {
this.queue = queue;
}
@Override
public void run() {
try {
Thread.sleep(2000);
queue.put("name1");
Thread.sleep(2000);
queue.put("name2");
Thread.sleep(2000);
System.err.println(queue.offer("name3"));
System.err.println(queue.size());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
static class ConsumerTask implements Runnable {
private BlockingQueue queue;
public ConsumerTask(BlockingQueue queue) {
this.queue = queue;
}
@Override
public void run() {
while (true) {
try {
String info = queue.peek();
System.err.println(info);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}