class Chat {
boolean flag = false;
public synchronized void Question(String msg) {
if (flag) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else
{System.out.println(msg);
flag = true;
notify(); }
}
public synchronized void Answer(String msg) {
if (!flag) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else
{System.out.println(msg);
flag = false;
notify();}
}
}
class T1 implements Runnable {
Chat m;
// String[] s1 = { "Hi", "How are you ?", "I am also doing fine!" };
String s1[] = { "10", "11", "12", "13", "14", "15" };
public T1(Chat m1) {
this.m = m1;
new Thread(this, "Question").start();
}
public void run() {
for (int i = 0; i < s1.length; i++) {
m.Question(s1[i]);
}
}
}
class T2 implements Runnable {
Chat m;
// String[] s2 = { "Hi", "I am good, what about you?", "Great!" };
String s2[] = { "1", "2", "3", "4", "5" };
public T2(Chat m2) {
this.m = m2;
new Thread(this, "Answer").start();
}
public void run() {
for (int i = 0; i < s2.length; i++) {
m.Answer(s2[i]);
}
}
}
public class TestThread {
public static void main(String[] args) {
Chat m = new Chat();
new T1(m);
new T2(m);
}
}
//
**如果我在两个同步方法中删除"else",上面的代码就可以正常工作。但我们实质上不是在暗示一个if-else条件而没有明确提及吗?例如,我们不是在做
if( flag check)
..
else??
或者线程在被通知后从if块后恢复?* *
当你问
线程是否在被通知后从if块后恢复?
线程一旦收到通知,就从之前进入的wait调用中恢复。它必须离开wait调用,但在此之前,它必须获得它在开始等待时放弃的锁。它不能从其他地方恢复。
在一个只有两个线程来回运行的例子中,你可能能够处理一些不能正常工作的事情。通常情况下,您可能会遇到多个线程争用锁并进行更改的情况,并且不能保证该标志将处于线程开始等待时的相同状态。这就是等待需要在循环中完成的主要原因,这样一旦线程重新获得锁,它就可以检查条件的当前状态是什么。(也有可能线程可以在没有任何通知的情况下唤醒。)