高同時プログラミングの基礎——JUC(Blocking Queブロック列)


インポート:
JUCとは?JUCとはJDK 1.5で提供されるセットとそのサブバッグのことです。java.util.co ncurrent、java.util.co ncurrent.lock、java.util.co ncurrent.atomic。その中の主な内容は、ブロック列、同時マッピング、ロック、アクチュエータサービス、原子的操作を含む。
ブロック列(blocking queue):
概念:
ブロック列も行列です。列ならFIFOに従います。なお、ブロック列の容量は声明の中で固定されており、拡張はできず、BQではnullは許されない。
閉塞性の表現:
1.キューが空で、スレッドがキューの中の要素を取得すると、スレッドがブロックされます。2.列がいっぱいで、スレッドが列に要素を入れると、スレッドがブロックされます。
BQに元素を追加する方法:
1.add:列がいっぱいになったら異常を投げます。Illagal StateException:Que full
queue.add("a");
2.offer:列がいっぱいになったらfalseに戻ります。渋滞しないで、次のような文を続けます。
boolean b = queue.offer("c");
System.out.println(b);
3.put:列がいっぱいで、永久ブロックが発生し、スレッドが停止してそこで動かない。
queue.put("d");
4.offer:タイミングブロック、列が満杯になると、設定された時間内にスレッドブロックが発生し、タイムアウトしたらブロックが停止し、下へ実行します。
 boolean b = queue.offer("e", 5, TimeUnit.SECONDS);
 System.out.println(b);
BQに要素を取得する方法:
取得したのはすべてヘッダです。
1.remove:列が空で、異常を投げます。
queue.remove()
2.poll:列がいっぱいになりました。nullに戻ります。
queue.poll()
3.列がいっぱいになり、永久ブロックが発生し、スレッドが停止して動かない
queue.take()
4.poll:タイミングブロックは、設定した時間内にスレッドブロックが発生し、タイムアウトしたらブロックが停止され、下へ実行されます。
queue.poll(5, TimeUnit.SECONDS)
blocking queueの常用実現類:
1.ArayBlocking Que-閉塞式シーケンス列:下の段:配列
要求:声明する時は容量を指定しなければなりません。
ArrayBlockingQueue<String> queue =new ArrayBlockingQueue<>(5);
        queue.add("a");
        queue.add("a");
        queue.add("a");
        queue.add("a");
        queue.add("a");
2.Linked Blocking Que-ブロッキングチェーン列:下の層:ノードがデータを保存する
要求:使用時に容量を指定してもいいし、指定しなくてもいいです。容量が指定されているなら、容量は可変ではない。容量が指定されていない場合、デフォルトはInteger.MAX_です。VALE=231-1は可変ではありません。実際の開発では、一般的には21億個の要素が列に格納されないため、容量は無限であると考えられています。
LinkedBlockingQueue<String> queue =new LinkedBlockingQueue<>();
3.PriorityBlockingQue-優先順位を持つブロック列:下の段:配列。
要求:使用時に容量を指定してもいいし、指定しなくてもいいです。指定しない場合はデフォルトの初期容量は11です。
このキューに保存されているのが基本的なデータの種類であれば、辞書順に並べ替えられます。カスタムタイプであれば、Comprableインターフェースを実現し、compreToメソッドをカバーして比較ルールを指定する必要があります。PriorityBlockingQueは繰り返している間、並べ替えが保証されません。もちろん、匿名の内部クラスの方法を使わなくてもいいです。使わないなら、比較器に入る必要はありません。
//           
 Comparator<Student> c = new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
            //  
                return o2.getScore() - o1.getScore();
            }
        };
//                
PriorityBlockingQueue<Student> queue =new PriorityBlockingQueue<>(5, c);