マルチスレッド学習ノート11-javaの渋滞行列
3095 ワード
ArayBlockingQue:行列構造からなる境界閉塞行列。Linked BlockingQue:チェーン構造で構成された境界閉塞行列です。PriorityBlockingQue:優先順位順位順位をサポートする無境界ブロック列・DelayQue:優先順位の列を使用して実装される無境界ブロック列。キャッシュに使えますが、redisにはすでに似たような機能がありますので、あまり役に立たないような気がします。Synch ronousQue:要素を記憶しないブロック列。各put操作はtake操作を待つ必要があります。そうでなければ、要素を追加し続けることができません。Linked Trans ferQue:チェーン構造からなる無境界ブロック列。Linked Trans ferQueはtryTransferとtransferの方法が多くなりました。トランスファーの方法は生産者から伝わる要素をすぐに消費者に届けることができます。消費者が受信待ちをしていない場合は、tranferメソッドは、要素をキューのtailノードに保存し、消費者に消費されてから戻ってきます。Linked Blocking Deque:チェーン構造で構成された双方向ブロック列で、双方向ブロック列は「作業盗撮」モードで使用できます。ArayBlocking Que使用例:
package day5;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class ArrayBlockingQueueTest {
ArrayBlockingQueue queue = new ArrayBlockingQueue<>(2);
public static void main(String[] args) {
ArrayBlockingQueueTest test = new ArrayBlockingQueueTest();
ExecutorService executor = Executors.newFixedThreadPool(2);
executor.execute(test.new Productor(test.queue));
executor.execute(test.new Consumer(test.queue));
}
class Productor implements Runnable{
private ArrayBlockingQueue queue;
public Productor(ArrayBlockingQueue queue) {
this.queue = queue;
}
@Override
public void run() {
String[] element = {"shidebin","jiangxi","shanghai"};
for(String item:element) {
try {
queue.put(item);
System.out.println(" :"+item);
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class Consumer implements Runnable{
private ArrayBlockingQueue queue;
public Consumer(ArrayBlockingQueue queue) {
this.queue = queue;
}
@Override
public void run() {
while(true) {
try {
String value = queue.take();
System.out.println(" :"+value);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
コンサート出力: :shidebin
:shidebin
:jiangxi
:jiangxi
:shanghai
:shanghai
Linked Blocking QueはArayBlocking Queよりも高い性能を持っています。ArayBlocking Queはputとtakeで同じRentratLockを使っていますが、Linked Blocking Queはputとtakeで違うロックを使っています。/**
* Creates a {@code LinkedBlockingQueue} with a capacity of
* {@link Integer#MAX_VALUE}.
*/
public LinkedBlockingQueue() {
this(Integer.MAX_VALUE);
}
/**
* Creates a {@code LinkedBlockingQueue} with the given (fixed) capacity.
*
* @param capacity the capacity of this queue
* @throws IllegalArgumentException if {@code capacity} is not greater
* than zero
*/
public LinkedBlockingQueue(int capacity) {
if (capacity <= 0) throw new IllegalArgumentException();
this.capacity = capacity;
last = head = new Node(null);
}