gpt4 book ai didi

java - wait后线程恢复(if-else的作用)

转载 作者:行者123 更新时间:2023-11-30 03:49:22 26 4
gpt4 key购买 nike

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 block 之后恢复?**

最佳答案

当你问

does the thread resume from after the if block after being notified?

线程一旦收到通知,就会从之前进入的等待调用中恢复。它必须离开等待调用,但在此之前,它必须获取开始等待时放弃的锁。它无法从其他任何地方恢复。

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

关于java - wait后线程恢复(if-else的作用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24805148/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com