【Java同時プログラミング】その21:同時新機能:ブロックキューとブロックスタック(コードを含む)
5090 ワード
転載は出典を明記してください.http://blog.csdn.net/ns_code/article/details/17511147
ブロックキュー
ブロックキューはJava 5の同時新機能の内容であり、ブロックキューのインタフェースはjavaである.util.concurrent.BlockingQueue、複数の実装クラスがあります:ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueueなど、使い方は大きく異なり、具体的にはJDKドキュメントを表示することができます.ここでは、ArrayBlockingQueueを簡単に例に挙げると、キューがいっぱいになると、要素がキューから出るまでブロックされます.後続の要素のみがキューに追加されます.
次の例を見てください.
実行結果から、キュー内の要素の数が20個に制限されているため、20個の要素を追加すると、他の要素がキュー外でブロックされて待機し、プログラムは終了しません.
キューがいっぱいになったら、キューの最初の要素を移動し、ブロックされたキューに要素を追加し続けることができます.コードを変更するには、次のようにします.
結果から、20番目の要素を追加すると、キューの先頭から要素を削除し、キューに要素を追加し続けることができ、その後、要素を追加するたびに、キューの先頭要素を削除することで、プログラムが終了することができます.
ブロックスタック
ブロックスタックはブロックキューと似ているが、Java 6に組み込まれた新しい特性であり、ブロックスタックのインタフェースjavaである.util.concurrent.BlockingDequeにも実装クラスが多く、使用方法も似ていて、JDKドキュメントを具体的に表示します.
簡単な例を次に示します.
プログラムは依然として待機をブロックし、次のコードに変更されます.
結果から、20番目の要素を追加した後、スタックトップ要素を移動することで、スタックに要素を追加し続けることができ、その後、要素を追加するたびにスタックトップ要素を移動することができ、プログラムを実行することができます.
ブロックキュー
ブロックキューはJava 5の同時新機能の内容であり、ブロックキューのインタフェースはjavaである.util.concurrent.BlockingQueue、複数の実装クラスがあります:ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueueなど、使い方は大きく異なり、具体的にはJDKドキュメントを表示することができます.ここでは、ArrayBlockingQueueを簡単に例に挙げると、キューがいっぱいになると、要素がキューから出るまでブロックされます.後続の要素のみがキューに追加されます.
次の例を見てください.
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ArrayBlockingQueue;
public class BlockingQueueTest{
public static void main(String[] args) throws InterruptedException {
BlockingQueue bqueue = new ArrayBlockingQueue(20);
for (int i = 0; i < 30; i++) {
//
bqueue.put(" " + i);
System.out.println(" :" + i);
}
System.out.println(" , ----");
}
}
の出力結果は次のとおりです.実行結果から、キュー内の要素の数が20個に制限されているため、20個の要素を追加すると、他の要素がキュー外でブロックされて待機し、プログラムは終了しません.
キューがいっぱいになったら、キューの最初の要素を移動し、ブロックされたキューに要素を追加し続けることができます.コードを変更するには、次のようにします.
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ArrayBlockingQueue;
public class BlockingQueueTest{
public static void main(String[] args) throws InterruptedException {
BlockingQueue bqueue = new ArrayBlockingQueue(20);
for (int i = 0; i < 30; i++) {
//
bqueue.put("" + i);
System.out.println(" :" + i);
if(i > 18){
// ,
System.out.println(" :" + bqueue.take());
}
}
System.out.println(" , ----");
}
}
の実行結果は次のとおりです.結果から、20番目の要素を追加すると、キューの先頭から要素を削除し、キューに要素を追加し続けることができ、その後、要素を追加するたびに、キューの先頭要素を削除することで、プログラムが終了することができます.
ブロックスタック
ブロックスタックはブロックキューと似ているが、Java 6に組み込まれた新しい特性であり、ブロックスタックのインタフェースjavaである.util.concurrent.BlockingDequeにも実装クラスが多く、使用方法も似ていて、JDKドキュメントを具体的に表示します.
簡単な例を次に示します.
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;
public class BlockingDequeTest {
public static void main(String[] args) throws InterruptedException {
BlockingDeque bDeque = new LinkedBlockingDeque(20);
for (int i = 0; i < 30; i++) {
//
bDeque.putFirst("" + i);
System.out.println(" :" + i);
}
System.out.println(" , ----");
}
}
の実行結果は次のとおりです.プログラムは依然として待機をブロックし、次のコードに変更されます.
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;
public class BlockingDequeTest {
public static void main(String[] args) throws InterruptedException {
BlockingDeque bDeque = new LinkedBlockingDeque(20);
for (int i = 0; i < 30; i++) {
//
bDeque.putFirst("" + i);
System.out.println(" :" + i);
if(i > 18){
// ,
System.out.println(" :" + bDeque.pollFirst());
}
}
System.out.println(" , ----");
}
}
の実行結果は次のとおりです.結果から、20番目の要素を追加した後、スタックトップ要素を移動することで、スタックに要素を追加し続けることができ、その後、要素を追加するたびにスタックトップ要素を移動することができ、プログラムを実行することができます.