キューインターフェイスはリストとセットと同じレベルで、両方ともコレクションインターフェイスを継承します。 LinkedListはキューインターフェイスを実装します。キューインターフェイスはLinkedListメソッドへのアクセスを狭めます(つまり、メソッドのパラメータータイプがキューである場合、キューインターフェイスによって定義されたメソッドのみにアクセスでき、LinkedListの非キューメソッドに直接アクセスできません)。 BlockingQueueは、キューインターフェイスを継承します。
キューはデータ構造です。 2つの基本操作があります。キューの最後に要素を追加し、キューのヘッドから要素を削除することは、キューがファーストインファーストでデータを管理することを意味します。完全なブロッキングキューに要素を追加したり、空のブロッキングキューからメタセクターを削除しようとすると、スレッドがブロックされます。ブロッキングキューは、複数のスレッドと協力する場合に便利なツールです。ワーカーのスレッドは、中間結果をブロッキングキューに定期的に保存できますが、他のワーカースレッドは中間結果を取り出して将来修正できます。キューは自動的に負荷のバランスを取ります。最初のスレッドセットが2番目のスレッドよりも遅くなると、結果を待っている間に2番目のスレッドセットがブロックされます。最初のスレッドセットが高速に実行されると、2番目のスレッドセットが追いつくのが待ちます。次の表は、JDK1.5でのキューをブロックする操作を示しています。
キューがいっぱいの場合はメタサーチを追加し、iiiegaislabeeplian例外を投げます
削除して、キューの頭の要素を返します。キューが空の場合、nosuchelementexceptionの例外がスローされます。
要素は、キューの頭の要素を返します。キューが空の場合、nosuchelementexceptionの例外がスローされます。
オファーは要素を追加し、キューがいっぱいの場合はtrueを返します、falseを返します
投票は、キューの頭の要素を削除して返します。キューが空の場合は、nullを返します。
Peekは、キューの頭の要素を返します。キューが空の場合は、nullを返します
キューがいっぱいの場合は要素を追加してブロックします
削除して、キューの頭の要素を返します。キューが空の場合、ブロック
削除、要素、提供、投票、およびピークは、実際にキューインターフェイスに属します。
キューをブロックする操作は、回答に従って次の3つのカテゴリに分けることができます。AAD、removee、および要素操作は、完全なキューに要素を追加したり、空のキューから要素を取得しようとする場合に例外をスローします。もちろん、マルチスレッドプログラムでは、キューがいつでも満腹または空になる可能性があるため、オファー、投票、ピークメソッドを使用することができます。これらのメソッドは、例外をスローせずにタスクを完了できない場合にエラーメッセージを提供するだけです。
注:ポーリングとピークのメソッドエラーとnullを返します。したがって、キューにヌル値を挿入することは違法です。
また、タイムアウトを備えたオファーおよびポーリングメソッドのバリエーションもあります。たとえば、次の呼び出し:
Boolean Success = q.offer(x、100、timeunit.milliseconds);
100ミリ秒でキューの尾に要素を挿入してみてください。成功した場合は、すぐにtrueを返します。それ以外の場合、タイムアウトに達したら、falseを返します。同様に、電話してください:
Object head = q.poll(100、timeunit.milliseconds);
キューヘッダー要素が100ミリ秒以内に正常に削除された場合、ヘッダー要素はすぐに返されます。それ以外の場合、タイムアウトに到達するとnullが返されます。
最後に、ブロッキング操作を行い、取得します。 PUTメソッドは、キューがいっぱいになったときにブロックし、キューが空のときのテイクメソッドはブロックされます。
java.ulil.concurrentパッケージは、ブロッキングキューの4つのバリエーションを提供します。デフォルトでは、LinkedBlockingQueueの容量は上限ではありません(不正確です。容量は指定されていない場合はinteger.max_valueです。これは、FIFOで要素をソートするリンクリストに基づいたキューです(最初は最初)。
ArrayBlockingQueueは、建設中に容量を指定する必要があり、公平性が必要かどうかを選択できます。公正なパラメーターがtrueに設定されている場合、最長の待機時間のスレッドが最初に処理されます(実際、この公平性はReentrantLockをTrueに設定することによって達成されます。つまり、最長の待機時間のスレッドが最初に動作します)。通常、公平性はパフォーマンスを犠牲にし、本当に必要な場合にのみ使用できます。これは、FIFO(最初の最初の)の原則に従って要素をソートするアレイベースのブロッキングループキューです。
PriorityBlockingQueueは、優先順位を持つキューであり、ファーストインファーストキューではありません。要素は優先順序で削除され、キューには上限がありません(ソースコードを見ました。優先ブロッキングキューは、ヒープデータ構造に基づいた優先順位の制限の再ラッピングです。優先順位の制限はありません。 outofmemoryerrorリソースが使い果たされているため)、しかし、キューが空の場合、要素の操作がブロックされるため、検索操作がブロックされます。さらに、キューに入る要素には、比較機能が必要です。
最後に、DelayQueue(PriorityQueueに基づいて実装)は、遅延した要素を保存する固定されていないブロッキングキューであり、遅延の有効期限が切れたときにのみ要素を抽出できます。このキューのヘッドは、遅延が期限切れになってから最長のストレージ時間を持つ遅延要素です。遅延の有効期限が切れていない場合、キューにはヘッダーがなく、投票はnullを返します。 getDelay(timeUnit.nanoconds)の要素のメソッドがゼロ以下の値を返すと、有効期限が発生し、投票が要素を削除します。このキューは、ヌル要素を許可しません。これが遅延インターフェイスです:
Javaコード
パブリックインターフェイスの遅延拡張<delayed> {long getDelay(TimeUnitユニット); }DelayQueueを配置する要素は、これを使用して要素をソートするCompareToメソッドも実装します。
次の例は、ブロッキングキューを使用してスレッドセットを制御する方法を示しています。プログラムは、1つのディレクトリとそのすべてのサブディレクトリ内のすべてのファイルを検索し、指定されたキーワードを含むファイルのリストを印刷します。次の例からわかるように、ブロッキングキューを使用することの2つの重要な利点は次のとおりです。一般的なキューのマルチスレッド操作には、追加の同期は必要ありません。さらに、キューは負荷のバランスを自動的にバランスさせます。つまり、処理(生産と消費の両側)が迅速に処理された場合、ブロックされ、それにより、両側の間の処理速度ギャップが減少します。以下は特定の実装です。
Javaコード
public class blockingQueuetest {public static void main(string [] args){scanner in = new scanner(system.in); System.out.print( "Base Directory(eg /usr/local/jdk5.0/src):"); string directory = in.nextline(); system.out.print( "キーワードを入力(volatileなど):");文字列キーワード= in.nextline(); final int file_queue_size = 10; // blocking queue size final int search_threads = 100; //キーワード検索スレッドの数// arrayblocking queueblockingqueue> queue = new arrayblockingqueu>(file_queue_size); // 1つのスレッドのみを起動して、ディレクトリFileEnumerationTask enumerator = new FileEnumerationTask(Queue、new File(directory))を検索します。新しいスレッド(enumerator).start(); // 100個のスレッドを起動して、(int i = 1; i <= search_threads; i ++)newスレッド(new searchtask(queue、keyword))のファイル内の指定されたキーワードを検索します。start(); }} class fileEnumerationTask実装{//ダムメタファイルオブジェクトはブロッキングキューの最後に配置され、ファイルがpublic staticファイルdummy = new file( "")を通過したことを示します。プライベートブロッキングキュー<ファイル>キュー;プライベートファイルstartingdirectory; public fileEnumerationTask(blockingQueue <file> queue、file startingdirectory){this.queue = queue; this.startingdirectory = startingdirectory; } public void run(){try {enumerate(startingDirectory); queue.put(dummy); //ここで実行して、指定されたディレクトリ内のファイルが通過していることを示します} catch(arternedexception E){}} for(file file:files){if(file.isdirectory())enumated(file); else //要素をキューの最後に置きます。キューがいっぱいの場合、queue.put(file)をブロックします。 }}} class searchtask実装runnable {private blockingqueue <file> queue;プライベート文字列キーワード。 public searchtask(blockingqueue <file> queue、string keyword){this.queue = queue; this.keyword = keyword; } public void run(){try {boolean done = false; while(!done){//キューの最初の要素を取り出します。キューが空の場合、file = queue.take()をブロックします。 if(file == fileEnumerationTask.dummy){//それを取り出して配置して、queue.put(file)を読み取るときに他のスレッドがすばやく終了するようにします。 done = true; } else search(file); }} catch(ioexception e){e.printstacktrace(); } catch(arternedexception e){}} public void search(file file)throws ioexception {scanner in = new scanner(new fileinputStream(file)); int linenumber = 0; while(in.hasnextline()){linenumber ++;文字列line = in.nextline(); if(line.contains(keyword))system.out.printf( "%s:%d:%s%n"、file.getPath()、linEnumber、line); } in.close(); }}元のリンク:http://www.cnblogs.com/end/ archive/2012/10/25/2738493.html
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。