ホームページ  >  記事  >  Java  >  JavaのブロッキングキューBlockingQueueのサンプルコード分析

JavaのブロッキングキューBlockingQueueのサンプルコード分析

黄舟
黄舟オリジナル
2017-04-01 10:30:071561ブラウズ

この記事では、主に Java の BlockingQueue の詳細な説明と例を紹介します。必要な方は、Java の BlockingQueue の詳細な説明と例を参照してください。BlockingQueue は、マルチスレッドの優れたソリューションです。まず、BlockingQueue は インターフェース です。これは非常に特殊なキューです。BlockQueue が空の場合、BlockingQueue からの取得操作はブロックされ、待機状態になります。 state

の場合、BlockingQueue に何かが入るまで起動されません。同様に、BlockingQueue に何かを保存しようとする操作もブロックされて待機状態になり、スペースが空くまで起動されません。 BlockingQueue を使用して操作を続行します。

BlockingQueue の 4 つの実装クラス:

1. ArrayBlockingQueue: 指定されたサイズの BlockingQueue。その コンストラクター

は、そのサイズを示すために int パラメーターを取る必要があります。それに含まれる

オブジェクト は FIFO (先入れ先出し) 順次ソート

2.LinkedBlockingQueue: コンストラクターが指定されたサイズのパラメーターを受け取る場合、生成される BlockingQueue にはサイズ制限があります。サイズは Integer.MAX_VALUE によって決まります。含まれるオブジェクトは FIFO (先入れ先出し) 順序で並べ替えられます3. PriorityBlockingQueue: LinkedBlockQueue と似ていますが、含まれるオブジェクトは FIFO ではなく、次に従って並べ替えられます。オブジェクトの自然な並べ替え順序、またはコンストラクターの Comparator によって決定される順序 4.SynchronousQueue:

BlockingQueue の一般的なメソッド:
を交互に実行する必要がある操作。

1) add(an
Object

): anObject を BlockingQueue に追加します。つまり、BlockingQueue がそれに対応できる場合は true を返します。そうでない場合は例外が報告されます

2) offer(anObject): 次の場合を示します可能であれば、BlockingQueue に anObject を追加します。つまり、BlockingQueue が対応できる場合は true を返し、それ以外の場合は false を返します。

3)put(anObject): BlockQueue にスペースがない場合は、anObject を追加します。このメソッドを呼び出すスレッドは、BlockingQueue に空きができるまでブロックされます。

4)poll(
time

): BlockingQueue の最初のオブジェクトをすぐに取り出すことができない場合は、待機することができます。 time パラメータで指定された時刻を取得できない場合は

null


を返します。 5) take(): BlockingQueue の最初のオブジェクトを取得します。BlockingQueue が空の場合、ブロックは待機状態になります。新しいオブジェクトがブロッキングに追加されます。 例:

この例は主にプロデューサーをシミュレートします。 コンシューマーとコンシューマーの間のワークフローは、コンシューマーが消費者向けの製品を生産するのをコンシューマーが待つという単純なシナリオです。 Producer:

package com.gefufeng;

import java.util.concurrent.BlockingQueue;

public class Producter implements Runnable{
 private BlockingQueue<String> blockingQueue;
 
 public Producter(BlockingQueue<String> blockingQueue){
 this.blockingQueue = blockingQueue;
 }

 @Override
 public void run() {
 try {
  blockingQueue.put("我生产的" + Thread.currentThread().getName());
  System.out.println("我生产的" + Thread.currentThread().getName());
 } catch (InterruptedException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  System.out.println("生产失败");
 }
 
 }
 
 

}

Consumer:

package com.gefufeng;

import java.util.concurrent.BlockingQueue;

public class Customer implements Runnable{
 private BlockingQueue<String> blockingQueue;
 
 public Customer(BlockingQueue<String> blockingQueue){
 this.blockingQueue = blockingQueue;
 }

 @Override
 public void run() {
 for(;;){
  try {
  String threadName = blockingQueue.take();
  System.out.println("取出:" + threadName);
  } catch (InterruptedException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  System.out.println("取出失败");
  }
 }
 }

}

実行クラス:

package com.gefufeng;

import java.util.concurrent.ArrayBlockingQueue;

public class Executer {
 
 public static void main(String[] args) {
 ArrayBlockingQueue<String> arrayBlockingQueue = new ArrayBlockingQueue<String>(2);
 Producter producter = new Producter(arrayBlockingQueue);
 Customer cusotmer = new Customer(arrayBlockingQueue);
 new Thread(cusotmer).start();
 for(;;){
  try {
  Thread.sleep(2000);
  new Thread(producter).start();
  } catch (InterruptedException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }
 }
 
 
 
 }

}
最初はConsumer

Loop

プロダクトを待っている、blockingQueue.take()が初めて実行されるとき、何も取得できません2 秒後、プロデューサがプロダクトを生成したため、blockingQueue がプロダクトを取得し、ログを出力しました。その後、コンシューマが 2 番目のループを実行し、blockingQueue.take() がプロダクトを再度取得していないことがわかりました。 . そのため、再びブロッキング状態になります。 。 。順番にループします

以上がJavaのブロッキングキューBlockingQueueのサンプルコード分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。