【Java同時プログラミング】その21:同時新機能:ブロックキューとブロックスタック(コードを含む)


転載は出典を明記してください.http://blog.csdn.net/ns_code/article/details/17511147
ブロックキュー
ブロックキューは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("        ,    ----"); 
        } 
}
の出力結果は次のとおりです.
【Java并发编程】之二十一:并发新特性—阻塞队列和阻塞栈(含代码)_第1张图片
実行結果から、キュー内の要素の数が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("        ,    ----"); 
        } 
}
の実行結果は次のとおりです.
【Java并发编程】之二十一:并发新特性—阻塞队列和阻塞栈(含代码)_第2张图片
結果から、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("        ,    ----"); 
	} 
}
の実行結果は次のとおりです.
【Java并发编程】之二十一:并发新特性—阻塞队列和阻塞栈(含代码)_第3张图片
プログラムは依然として待機をブロックし、次のコードに変更されます.
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("        ,    ----"); 
	} 
}
の実行結果は次のとおりです.
【Java并发编程】之二十一:并发新特性—阻塞队列和阻塞栈(含代码)_第4张图片
結果から、20番目の要素を追加した後、スタックトップ要素を移動することで、スタックに要素を追加し続けることができ、その後、要素を追加するたびにスタックトップ要素を移動することができ、プログラムを実行することができます.