Javaキューの使用

5009 ワード

Que:基本的に、一つの列は先入先出(FIFO)のデータ構造QueインターフェースとList、Setと同じレベルで、Collectionインターフェースを継承しています。Linked ListはDequeインターフェースを実現しました。
Queの実現
1、実現されていないブロックインターフェースのLinked List:java.util.Queインターフェースとjava.util.AbstractQueインターフェースに内蔵されているブロックされていない行列を実現しました。PriorityQueとConcerentLinue PriorityQue、およびConcerentLink Link Que QueクラスはCollect Linkの2つのセットに参加します。PriorityQueクラスは、実質的に順序リストを維持しています。Queueに加入する要素は、それらの天然の順序(Java.util.cmparableによって実現される)または構造関数に伝達されるjava.util.compratorによって実現される。Conccurrent LinkedQueは、リンクノードに基づくスレッドセキュリティのキューです。同時アクセスは同期を必要としません。列の最後尾に要素を追加して頭から削除するので、列の大きさを知る必要がない限り、ConcerentlinkedQueは共通の集合に対する共有アクセスがよくできます。キューサイズに関する情報を収集するのは遅くなりますので、キューを巡回する必要があります。
2)ブロックインターフェースを実現する:java.util.co ncurrentにBlockingQueインターフェースと5つのブロック列類が追加されています。実質的には少しいびつなFIFOデータ構造である。直ちにキューから要素を追加または削除するのではなく、スレッドは空間または要素が利用可能になるまで動作ブロックを実行します。5つの列が提供しているのはそれぞれ違っています。*ArayBlockingQue:行列でサポートされている有界行列です。*リンクノードによってサポートされるオプションの境界列。*PriorityBlockingQue:優先順位スタックによってサポートされる無境界優先順位の列。*DelayQue:優先順位スタックによってサポートされる時間ベースのスケジュール待ち行列。*Synch ronousQue:BlockingQueインターフェースを利用した簡単な凝集機構です。
下の表はjdk 1.5の渋滞列の操作を示しています。
addは、元のケーブルを追加します。列がいっぱいになったら、IIIevgaISlabEeplian異常removeを投げて削除して、列の先頭の要素を返します。もし列が空なら、NoSuchElement Excetion異常elementをスローします。列がいっぱいになったらfalse pollに戻り、列のヘッダの要素を削除して返します。列が空であれば、null peekに戻ります。列が空であれば、null putに戻ります。列の先頭に戻る要素をブロックします。列が空なら、ブロックします。
remove、element、offer、poll、peekは実はQueueインターフェースに属します。
遮断されたキューの動作は、応答によって以下の3つに分類されます。aad、removee、およびelementは、満杯のキューのために要素を追加したり、空き列から要素を取得したりするときに例外を投げます。もちろん、マルチスレッドプログラムでは、待ち行列はいつでもいっぱいになるか、あるいは空になるかもしれませんので、offer、poll、peek方法を使用したいかもしれません。これらの方法はタスクが完了できない時にはエラー表示だけを示しています。注意:pollとpeekメソッドがエラーでnullに戻ります。したがって、列にnull値を挿入するのは合法的ではない最後です。ブロック操作putとtakeがあります。putメソッドは、列がいっぱいになるとブロックされ、takeメソッドは、列が空いている時にブロックされます。Linked BlockingQueの容量は上限がないです。(正確ではないということです。指定されていない時、容量はInteger.MAXUVALEです。そうでなければ、putでは邪魔されません。)、最大容量を指定することもできます。チェーンベースの列です。この列はFIFO(先進先出)で並べ替えられます。
ArayBlockingQueは構造時に容量を指定し、公平性が必要かどうかを選択できます。もし公平なパラメータがtrueに設定されているなら、待ち時間が一番長いスレッドは優先的に処理されます。通常、公平性はあなたに性能の上で代価を払わせます。本当に必要な時だけ使います。これは配列のブロッキングループ・キューに基づいています。このキューはFIFO(先入先出)原則に従って要素を並べ替えます。
PriorityBlockingQueは優先順位のある列で、先進的な先に列を出るのではありません。要素は優先順位で削除されます。列にも上限がありません。(ソースコードを見てみました。PriorityBlocking QueはPriorityQueの再包装です。データの山の構造に基づいています。PriorityQueは容量制限がないので、ArayListと同じです。優先的に列をふさぐ時にputは邪魔されません。この列の論理的には無境界ですが、資源が、資源が消耗されているため、操作を追加する可能性があります。OutOfMemoryErrer)は、列が空いていると要素を取る操作が止まるので、検索操作は妨げられます。また、列に入る要素は比較的能力があります。
DelayQue(PriorityQueに基づいて実現された)はDelayed要素を格納した無境界ブロック列であり、遅延期間満了時にのみ要素を抽出することができます。この列の先頭は遅延期間満了後の保存時間が最も長いDelayed要素です。遅延がまだ満期にならないと、列に頭がなく、pollはnullに戻ります。要素のgetDelay(TimeUnit.NANOSECONDS)方法は、ゼロ以下の値を返すと、満期が到来し、pollはこの要素を除去します。このキューはnull要素を使用することができません。
一例:
package com.yao;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class BlockingQueueTest {
 /**
         
  */
 public static class Basket{
  //   ,    3   
  BlockingQueue basket = new ArrayBlockingQueue(3);

  //     ,    
  public void produce() throws InterruptedException{
   // put        , basket  ,  basket   
   basket.put("An apple");
  }
  //     ,      
  public String consume() throws InterruptedException{
   // get        , basket  ,  basket     
   String apple = basket.take();
   return apple;
  }

  public int getAppleNumber(){
   return basket.size();
  }

 }
 //     
 public static void testBasket() {
  //           
  final Basket basket = new Basket();
  //        
  class Producer implements Runnable {
   public void run() {
    try {
     while (true) {
      //     
      System.out.println("         :" 
        + System.currentTimeMillis());
      basket.produce();
      System.out.println("         :" 
        + System.currentTimeMillis());
      System.out.println("       :"+basket.getAppleNumber()+" ");
      //   300ms
      Thread.sleep(300);
     }
    } catch (InterruptedException ex) {
    }
   }
  }
  //        
  class Consumer implements Runnable {
   public void run() {
    try {
     while (true) {
      //     
      System.out.println("         :" 
        + System.currentTimeMillis());
      basket.consume();
      System.out.println("         :" 
        + System.currentTimeMillis());
      System.out.println("       :"+basket.getAppleNumber()+" ");
      //   1000ms
      Thread.sleep(1000);
     }
    } catch (InterruptedException ex) {
    }
   }
  }

  ExecutorService service = Executors.newCachedThreadPool();
  Producer producer = new Producer();
  Consumer consumer = new Consumer();
  service.submit(producer);
  service.submit(consumer);
  //     10s ,      
  try {
   Thread.sleep(10000);
  } catch (InterruptedException e) {
  }
  service.shutdownNow();
 }
 public static void main(String[] args) {
  BlockingQueueTest.testBasket();
 }
}