JAva concurrentのLinkedBlockingQueue

2655 ワード

JAva concurrentのLinkedBlockingQueue
リンクされたノードに基づいた任意の範囲の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();
                }
            }

        }
    }

}