等待后线程恢复(if-else的角色)


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调用,但在此之前,它必须获得它在开始等待时放弃的锁。它不能从其他地方恢复。

在一个只有两个线程来回运行的例子中,你可能能够处理一些不能正常工作的事情。通常情况下,您可能会遇到多个线程争用锁并进行更改的情况,并且不能保证该标志将处于线程开始等待时的相同状态。这就是等待需要在循环中完成的主要原因,这样一旦线程重新获得锁,它就可以检查条件的当前状态是什么。(也有可能线程可以在没有任何通知的情况下唤醒。)

最新更新