java閉塞行列の実施原理と実例解析


この文章は主にjava閉塞行列の原理と実例解析を紹介しています。ここでは例示コードによって紹介された非常に詳細で、皆さんの学習や仕事に対して一定の参考学習価値を持っています。必要な友達は下記を参照してください。
渋滞行列は普通の列と違っています。キューが空の場合、キューから要素を取得する操作はブロックされます。または、列がいっぱいになると、要素が列に追加されてブロックされます。空のブロッキング列から要素を取得しようとするスレッドは、他のスレッドが空の列に新しい要素を挿入するまでブロックされます。同じように、ブロックされた列に新しい要素を追加しようとするスレッドもブロックされ、他のスレッドがキューを再びアイドル状態にするまで、列から要素を一つ以上取り除くか、または完全にキューを空にするか、どうやってブロックするかを示しています。

スレッド1はブロック列に要素を追加し、スレッド2はブロック列から要素を除去する。
JDKは5.0からJava.util.co ncurrentのカバンの中で列を塞ぐ公式の実現を提供しました。JDKには閉塞行列の公式実装が含まれていますが。
列をブロックする
ブロック列の実現は、帯域上限のSemaphoreと同様である。
余計なことを言わない:

package com.huojg.test;
import java.util.LinkedList;
import java.util.List;
public class BlockingQueue { 
   private List queue = new LinkedList(); 
   private int limit = 10;    
   public BlockingQueue(int limit){ 
    this.limit = limit; 
   }      
   public synchronized void enqueue(Object item) 
   throws InterruptedException { 
    while(this.queue.size() == this.limit) { 
     wait(); 
    } 
    if(this.queue.size() == 0) { 
     notifyAll(); 
    } 
    this.queue.add(item); 
   }   
   public synchronized Object dequeue() 
   throws InterruptedException{ 
    while(this.queue.size() == 0){ 
     wait(); 
    } 
    if(this.queue.size() == this.limit){ 
     notifyAll(); 
    } 
    return this.queue.remove(0); 
   } 
  } 
enqueueとdequeueメソッドの内部では、列のサイズが上限または下限(0)に等しい場合のみ、notifyAllメソッドを呼び出すことができることに注意してください。列のサイズが上限に等しくない場合、下限にも等しくない場合、任意のスレッドがenqueueまたはdequeueメソッドを起動した場合、ブロックされず、正常に列に要素を追加または削除することができます。
Javaでは、ロックとCondationは、伝統的なsynchronizedおよびwait/notify機構の代替として理解され得る。
wait/notifyには制限があります。wait/notifyを呼び出すスレッドは対象のロックを持たなければなりません。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。