Java 等待总是需要通知才能工作吗?
直到现在我才意识到等待总是需要通知才能正常工作。但是当我尝试下面的代码时,我对等待和通知的工作有点困惑。我创建了三个线程t1、t2、t3,并分别通过了可运行的t1、t2和t3。据我所知,在启动这三个线程时,只有t1应该打印,t2和t3应该进入等待状态并继续等待,因为没有人通知 但是o/p对我来说是不可预测的。有人能帮我解释一下吗。下面是我的课程Java 等待总是需要通知才能工作吗?,java,multithreading,wait,notify,Java,Multithreading,Wait,Notify,直到现在我才意识到等待总是需要通知才能正常工作。但是当我尝试下面的代码时,我对等待和通知的工作有点困惑。我创建了三个线程t1、t2、t3,并分别通过了可运行的t1、t2和t3。据我所知,在启动这三个线程时,只有t1应该打印,t2和t3应该进入等待状态并继续等待,因为没有人通知 但是o/p对我来说是不可预测的。有人能帮我解释一下吗。下面是我的课程 package com.vikash.Threading; class T1 implements Runnable { private S
package com.vikash.Threading;
class T1 implements Runnable {
private State state;
public T1(State state) {
this.state=state;
}
@Override
public void run() {
synchronized (state) {
while(state.getState()!=1) {
try {
state.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized (state) {
System.out.println(Thread.currentThread().getName());
state.setState(2);
}
}
}
}
class T2 implements Runnable {
private State state;
public T2(State state) {
this.state=state;
}
@Override
public void run() {
synchronized (state) {
while(state.getState()!=2) {
try {
state.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized (state) {
System.out.println(Thread.currentThread().getName());
state.setState(3);
}
}
}
}
class T3 implements Runnable {
private State state;
public T3(State state) {
this.state=state;
}
@Override
public void run() {
synchronized (state) {
while(state.getState()!=3) {
try {
state.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized (state) {
System.out.println(Thread.currentThread().getName());
state.setState(1);
}
}
}
}
public class Sequence {
public static void main(String[] args) {
State state=new State();
Thread t1=new Thread(new T1(state),"First");
Thread t2=new Thread(new T2(state),"Second");
Thread t3=new Thread(new T3(state),"Third");
t1.start();
t2.start();
t3.start();
}
}
package com.vikash.Threading;
public class State {
private int state=1;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
}
根据评论,我正在修改我的问题。o/p有时我得到的是第一秒,它不会终止,有时是第一秒到第三秒,然后终止。您的期望是不正确的,您的所有线程都可能在当前编写程序时打印并结束(但这取决于随机机会) 这取决于哪个线程首先使用所有线程都具有的
同步
块在状态
上抓取监视器
考虑这个流程:
synchronized(状态)
块。T2和T3正在等待进入其已同步(状态)
块状态等待。getState()==1
,因此改为state.state
synchronized(state)
块,假设它是T2(首先输入的是Java中未定义的行为,很可能是随机的)state.getState()==2等待
state.state
您的期望是不正确的,您的所有线程都可能在当前编写程序时打印并结束(但这取决于随机机会) 这取决于哪个线程首先使用所有线程都具有的
同步
块在状态
上抓取监视器
考虑这个流程:
synchronized(状态)
块。T2和T3正在等待进入其已同步(状态)
块状态等待。getState()==1
,因此改为state.state
synchronized(state)
块,假设它是T2(首先输入的是Java中未定义的行为,很可能是随机的)state.getState()==2等待
state.state
请解释,但o/p对Memy不可预测可能不是原因,但您是否意识到您已嵌套
已同步
请解释,但o/p对Memy不可预测可能不是原因,但您是否意识到您已嵌套已同步
请参见