私がやろうとしているのは、親スレッドから受け取ったメッセージをスレッドに書き込んで OutputStream にし、応答を InputStream でリッスンしてから、親スレッドに応答を通知することです。私は、似たようなことを行う 2 つのテスト クラスを作成しましたが、異なる方法で単純化しました。方法 1 は"before loop"
デバッグ ステートメントがコメント解除されている場合にのみ機能し、方法 2 は"message from child"
デバッグ ステートメントのみを出力します。私は何を間違っていますか?
方法 1
public class Parent {
private static int out = 0;
private static int in = 0;
public static void main(String[] args) {
final Object locker = new Object();
Thread t = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
synchronized (locker) {
try {
locker.wait();
System.out.println("Message from parent " + out);
in = out + 10;
locker.notify();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
});
t.start();
System.out.println("before loop");
while (out < 10) {
synchronized (locker) {
locker.notify();
try {
locker.wait();
out++;
System.out.println("Message from child " + in);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
方法 2
public class Parent {
/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
final BlockingQueue<Integer> q = new ArrayBlockingQueue<Integer>(1);
Thread t = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Integer i = q.take();
System.out.println("Message from parent: " + i.intValue());
q.put(i.intValue() + 10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
for (int i = 0; i < 10; i++) {
q.put(i);
Integer j = q.take();
System.out.println("Message from child: " + j);
}
}
}