BlockingQueueがいっぱいの場合、その中に物を保存しようとする操作はブロックされ、ブロックキューに新しいスペースがあるまで操作を継続するように目覚めません。
BlockingQueueによって提供される主な方法は次のとおりです。
追加(anobject):blockingqueueにaNobjectを追加します。
オファー(anobject):ブロッキングキューがそれに対応できる場合は、blockingqueueにaNobjectを追加します。
put(anobject):blockingqueueにanobjectを追加します。
Poll(時間):すぐに取り出すことができない場合、最初にランク付けされたオブジェクトを取り出します。取得できないときにnullを返します。
Take():ブロックキューが空である場合、最初にランク付けされたオブジェクトを取り出します。
さまざまなニーズに応じて、ブロッキングキューの4つの特定の実装があります。
(1)ArrayBlockingQueue:指定されたサイズのコンストラクターには、サイズを示すためのINTパラメーターが必要です。含まれるオブジェクトは、FIFO(ファーストイン、ファーストアウト)順序でソートされます。
(2)LinkedBlockingQueue:サイズのさまざまなサイズのブロッキングキュー。
サイズパラメーターが含まれていない場合、生成されたブロッキングキューのサイズはinteger.max_valueによって決定されます。含まれるオブジェクトは、FIFO(ファーストイン、ファーストアウト)順序でソートされます。
LinkedBlockingQueueおよびArrayBlockingQueueと比較して、その背後に使用されるデータ構造は異なります。
LinkedBlockingQueueのデータスループットはArrayBlockingQueueのデータよりも大きくなりますが、スレッドの数が多い場合、パフォーマンスの予測性はArrayBlockingQueueのパフォーマンスよりも低くなっています。
(3)PriorityBlockingQueue:LinkedBlockingQueueと同様ですが、それに含まれるオブジェクトの並べ替えはFIFOではなく、オブジェクトの自然な選別順序またはコンストラクターによって提起された比較器によって決定される順序によって決定されます。
(4)Synchronousqueue:特別なブロッキングキュー、その操作は、パッティングとフェッチングによって交互に完了する必要があります。
コードコピーは次のとおりです。
パッケージcom.yao;
java.util.concurrent.arrayblockingqueueをインポートします。
java.util.concurrent.blockingqueueをインポートします。
java.util.concurrent.executorserviceをインポートします。
java.util.concurrent.executorsをインポートします。
public class blockingqueuetest {
/**
アップルのバスケットを定義します
*/
public static classバスケット{
//バスケット、3つのリンゴを保持できる
blockingqueue <string> basket = new arrayblockingqueue <string>(3);
//リンゴを生産し、バスケットに入れます
public void produce()throws arturnedexception {
//プット方法にリンゴを置きます。
basket.put( "an apple");
}
//リンゴを消費して、バスケットから取り出します
public string cournume()throws arturnedexception {
//メソッドはリンゴを取り出します。
文字列Apple = basket.take();
リンゴを返します。
}
public int getApplEnumber(){
return basket.size();
}
}
//テスト方法
public static void testbasket(){
//リンゴ付きのバスケットを構築します
最終バスケットバスケット= new Basket();
// Appleプロデューサーを定義します
クラスプロデューサーは実行可能{
public void run(){
試す {
while(true){
// Appleを生産します
System.out.println(「プロデューサーはリンゴを生産する準備ができています:」
+ system.currenttimemillis());
basket.produce();
System.out.println(「プロデューサーはリンゴの生産を終了しました:」
+ system.currenttimemillis());
System.out.println( "生産後、リンゴがあります:"+basket.getApplenumber()+");
// 300ms睡眠
thread.sleep(300);
}
} catch(arternedexception ex){
}
}
}
// Appleの消費者を定義します
クラスの消費者は実行可能{
public void run(){
試す {
while(true){
// Appleの消費
System.out.println(「消費者はAppleを消費する準備ができています:」
+ system.currenttimemillis());
basket.consume();
System.out.println(「消費者はAppleを消費する」
+ system.currenttimemillis());
System.out.println( "消費後、リンゴがあります:"+basket.getApplenumber()+");
// 1000ms睡眠
thread.sleep(1000);
}
} catch(arternedexception ex){
}
}
}
executorservice service = executors.newcachedthreadpool();
プロデューサープロデューサー= new Producer();
Consumer Consumer = new Consumer();
service.submit(プロデューサー);
service.submit(消費者);
//プログラムが10秒間実行された後、すべてのタスクが停止します
試す {
thread.sleep(10000);
} catch(arternedexception e){
}
service.shutdownnow();
}
public static void main(string [] args){
blockingqueuetest.testbasket();
}
}