演習課題「ArrayBlockingQueueを使ってみよう」
現在、ArrayBlockingQueueを使用して2つのThreadでサイズが3のキューに0から9までの値を順に追加、取得しようとしています。コードを追記して、正しく動作するようにしてください。
なお、コンパイルコマンドについて理解できれいれば、以下のコマンドをコピーして利用してください。
javac -d classes/jp.paiza.thread -p classes source/jp.paiza.thread/module-info.java source/jp.paiza.thread/jp/paiza/thread/*.java
また、実行コマンドについて理解できていれば、以下の実行コマンドをコピーして利用してください。
java -p classes --module jp.paiza.thread/jp.paiza.thread.TEST
期待する出力値
[]
[0]
[]
[1]
[]
[2]
[]
[3]
[3, 4]
[4]
[4, 5]
[5]
[5, 6]
[6]
[6, 7]
[7]
[7, 8]
[7, 8, 9]
[8, 9]
[9]
#10:並行コレクション5(Queue)
このチャプターでは、並行コレクションのQueueについて学習します。
ブラウザを開くだけでエディタ、Webサーバ、DB等の開発環境が整うクラウド開発環境PaizaCloudクラウドIDE。
PaizaCloud
https://paiza.cloud/ja/
シェルコマンド入門編
https://paiza.jp/works/shellcommand/primer
Linux入門編
https://paiza.jp/works/linux/primer
新・Linux入門編(LinuC対策版)
https://paiza.jp/works/linux/new-primer
新・Java入門編34: モジュール・システムについて学習しよう
https://paiza.jp/works/java/new-primer/java-new-primer-34
新・アルゴリズムとデータ構造入門 Java編10: スタック・キュー
https://paiza.jp/works/algorithm-java/new-primer/algorithm-java-new-primer-10
問題集: スタック・キューメニュー
https://paiza.jp/works/mondai/stack_queue/problem_index?language_uid=java
インタフェースQueue
https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/Queue.html
インタフェースBlockingQueue
https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/concurrent/BlockingQueue.html
クラスArrayBlockingQueue
https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/concurrent/ArrayBlockingQueue.html
クラスConcurrentModificationException
https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/ConcurrentModificationException.html
コンパイルコマンドjavac -d classes/jp.paiza.thread -p classes source/jp.paiza.thread/module-info.java source/jp.paiza.thread/jp/paiza/thread/*.java
実行コマンドjava -p classes --module jp.paiza.thread/jp.paiza.thread.A
A.javapackage jp.paiza.thread;
import java.util.*;
import java.util.concurrent.*;
public class A {
public static void main(String... args) {
var q = new ArrayBlockingQueue<Integer>(3);
var t1 = new Thread(() -> {
try {
for (int i = 0; i < 10; i++) {
System.out.println(i + ":Produced: " + q.size());
// キューが満杯だとブロック
q.put(i);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
var t2 = new Thread(() -> {
try {
for (int i = 0; i < 10; i++) {
System.out.println(i + ":Consumed: " + q.size());
// キューが空だとブロック
q.take();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}