私はマルチスレッド化が初めてで、wait、notify、notifyAllの機能について知っています。私は3つのスレッドを1つずつ実行し、AからZまでのアルファベットを表示したい。 以下のコードを試してみたが、これもうまくいくようだが、これが問題を解決する最善の方法かどうかは疑問だ。それ以外の方法はありますか?私はそれをよりシンプルに、より良くすることができますか?私のコードの一部が繰り返されているようです。マルチスレッドプログラムを作成するにはどうすればいいですか?
package demo.threading;
class Flags {
boolean flagA = true;
boolean flagB = false;
boolean flagC = false;
}
class Container {
Flags flags = new Flags();
int charVal = (int) 'A';
void producer1() {
try {
while (charVal <= (int) 'Z') {
synchronized (this) {
if (!flags.flagA)
wait();
else {
System.out.println(Thread.currentThread().getName() + " Produced : " + (char) charVal);
flags.flagA = false;
flags.flagB = true;
charVal++;
notifyAll();
Thread.sleep(1000);
}
}
}
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
void producer2() {
try {
while (charVal <= (int) 'Z') {
synchronized (this) {
if (!flags.flagB)
wait();
else {
System.out.println(Thread.currentThread().getName() + " Produced : " + (char) charVal);
flags.flagB = false;
flags.flagC = true;
charVal++;
notifyAll();
Thread.sleep(1000);
}
}
}
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
void producer3() {
try {
while (charVal <= (int) 'Z') {
synchronized (this) {
if (!flags.flagC)
wait();
else {
System.out.println(Thread.currentThread().getName() + " Produced : " + (char) charVal);
flags.flagC = false;
flags.flagA = true;
charVal++;
notifyAll();
Thread.sleep(1000);
}
}
}
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
public class Main {
public static void main(String[] args) {
Container container = new Container();
Thread t1 = new Thread(() -> container.producer1(), "Thread 1");
Thread t2 = new Thread(() -> container.producer2(), "Thread 2");
Thread t3 = new Thread(() -> container.producer3(), "Thread 3");
t1.start();
t2.start();
t3.start();
}
}
出力は次のようになります。
あなたは、この「次々に」やりたい場合は、前に指摘したようにThread 1 Produced : A
Thread 2 Produced : B
Thread 3 Produced : C
Thread 1 Produced : D
Thread 2 Produced : E
Thread 3 Produced : F
最良の方法は 'のSystem.out.println(" ABC ... XYZABCです。 ..XYZABC ... XYZ ")';またはあなたが達成しようとしている秩序を問わず。このような例からマルチスレッドを学習しようとするときの問題は、単にマルチスレッドを必要としないということです。 –
この例は幾分意味がありません: 'wait'をループで使うべきです** - " 1つの引数バージョンと同様に、割り込みと擬似ウェイクアップが可能で、このメソッドは常にループで使用する必要があります " * [JavaDoc](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#wait--)からcatchブロックはスレッドを終了させるだけで、誤った割り込み。 – Fildor
@Fildor、こんにちは、あなたのフィードバックのおかげで、同じを達成するためのより良い賢明な方法をお勧めしますか? –