Javaのキューキューに

速攻は速攻で廃棄物を作る到達するために無駄になります!

リスト、同じレベルに設定、継承されたコレクションインタフェース、キューキューは、FIFOデータ構造体です。

キューの実現

  • ブロッキングキュー(BolckingQueue)
  • ノンブロッキングキュー

ブロッキングキュー(BolckingQueue)

まず、挿入と削除

1、挿入

キューが満杯になるまで、実行キュースレッド挿入要素が不満。

2、削除

あなたは、キューが空になるまでキューが空で削除することはできません。

フルタイムの挿入、例外がスローされます空の時間を削除:例外がスローされます。

特別な値を返します:真の成功したリターンを挿入

ブロックされました:キューが使用可能になるまで、完全なブロックにスレッドを取り、空を置くとき。

二、JDK7は7つのブロックされたキューを提供しています:

1、ArrayListBlockingQueue

ArrayBlockingQueueは有界ブロッキングキューの配列によって支えられています。読み出しおよび書き込み動作が容器全体をロックする必要のある、スループットは、一般的に「生産者 - 消費者」モデルを実現するのに適した、類似して達成​​されます。 

2、LinkedBlockingQueue

双方向キューからなるリンクリスト構造によってブロックされました。

キューベースのリストをブロックする、データ・バッファ・キュー内で維持しました。キューにデータ生産に置かれたとき、キューは、生産からデータを取得し、キュー内の内部バッファ、直ちに生産による戻り、キューバッファときに最大バッファ容量、生産キューをブロックします、個人消費は、データキューから落ちたまで消費者の治療にも同じ原理に基づいているのに対し、生産者スレッドは、起こされるだろう。

でき、効率的な処理同時データLinkedBlockingQueueだけでなく、それは高い並行キューの並列動作の場合には制御データ同期手段の生産者と消費者のそれぞれに、別々のロックを使用するため、生産者と消費者のために同時キューの全体的なパフォーマンスを向上させるためにデータ。

3、SynchronousQueue

特定の元素を添加した後、キューを遮断することなく、記憶素子を除去し、他のスレッドの待機を継続するために添加しなければなりません。

4 PriorityBlockingQueue 

むしろもない上限値であるFIFOキューよりも、優先度のキューが、キューが空の場合、オペレータは、撮影したブロッキング要素を取ります。

5、DelayQueue

遅延された記憶素子は、その遅延が満了したときに無制限のブロッキングキュー要素のみから抽出することが可能です。

三、ArrayListBlockingQueueとLinkedBlockingQueueの違いは?

1、別のキューでロック

ArrayBlockingQueueの生産者と消費者が同じロックを使用します。

LinkedBlockingQueue生産はputLockで、消費がtakeLockです。

図2に示すように、異なる操作の生産と消費

キューでの生産と消費ArrayBlockingQueueを達成、直接列挙オブジェクトが挿入または削除することです。

オブジェクトを列挙する必要のLinkedBlockingQueue実現の生産と消費のキューが挿入またはノードを削除するように変換すると、それがパフォーマンスに影響を与えることができます。

キューサイズを初期化する3、さまざまな方法

ArrayBlockingQueue実装は、キューのサイズを指定する必要があります。

LinkedBlockingQueueは、サイズを指定することはできませんが、デフォルトはInteger.MAX_VALUEであります

LinkedBlockingQueueのパフォーマンスよりも優れた性能、より速く実行、ArrayBlockingQueueの優先順位をArrayBlockingQueue!

ノンブロッキングキュー

ConcurrentLinkedQueueはリンクノードに基づく、アンバウンド形式のスレッドセーフなキューである、それはノードをソートするFIFO規則を使用して、我々はそれがキューの末尾に追加された要素を追加したとき、我々は要素を取得する場合、それが返されますキュー要素のヘッド。

チームとチームは、複数のスレッドが同時に実行できるようにするCAS(比較およびセット)更新を採用しており、より良い並行処理を行うスレッドをロックし、ブロックされません。

注:マルチスレッドの同期を実現するためのCASアトミック命令は、メモリ位置の内容は、同じの場合には、メモリ位置の内容が新たな設定値に変更され、指定された値と比較されるであろう。 

コード例

package OSChina.Client;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class BlockingQueueTest {
    static final SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
    //定义装苹果的篮子
    public static class Basket{
        // 篮子,能够容纳3个苹果
       static BlockingQueue<String> queue = new ArrayBlockingQueue<String>(3);
        //生产苹果,放入篮子
        public void produce() throws InterruptedException{
            queue.put("An apple");
        }
        // 消费苹果,从篮子中取走
        public String consume() throws InterruptedException{
            String apple = queue.take();
            return apple;
        }
        public static int getAppleNumber(){
            return queue.size();
        }
    }

    public static void testBasket(){
        // 建立一个装苹果的篮子
        final Basket basket = new Basket();
        //定义苹果生产者
        class Producer implements Runnable{
            @Override
            public void run() {
                try {
                    while (true){
                        System.out.println("生产者准备生产苹果:"+sdf.format(new Date())+",篮子中苹果数量:"+Basket.getAppleNumber());
                        basket.produce();
                        System.out.println("生产者生产苹果完毕:" + sdf.format(new Date())+",篮子中苹果数量:"+Basket.getAppleNumber());
                        Thread.sleep(300);
                    }
                }catch (InterruptedException  ex){
                }
            }
        }
        //定义苹果消费者
        class Consumer implements Runnable{
            @Override
            public void run() {
                try {
                    while (true){
                        System.out.println("消费者准备消费苹果:" + sdf.format(new Date())+",篮子中苹果数量:"+Basket.getAppleNumber());
                        basket.consume();
                        System.out.println("消费完后有苹果:" + sdf.format(new Date())+",篮子中苹果数量:"+Basket.getAppleNumber());
                        Thread.sleep(1000);
                    }
                }catch (InterruptedException ex){
                }
            }
        }

        ExecutorService service = Executors.newFixedThreadPool(2);
        Producer producer = new Producer();
        Consumer consumer = new Consumer();
        service.submit(producer);
        service.submit(consumer);
        // 程序运行10s后,所有任务停止
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        service.shutdownNow();
    }

    public static void main(String[] args) {
        BlockingQueueTest.testBasket();
    }
}

公開された110元の記事 ウォンの賞賛8 ビュー6925

おすすめ

転載: blog.csdn.net/guorui_java/article/details/104109604