Data.java
package org.example.testwaitnotify;
public class Data {
private int value;
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
ThreadA.java
package org.example.testwaitnotify;
import java.util.concurrent.TimeUnit;
public class ThreadA extends Thread {
private Data data;
private Object lock;
public ThreadA(Data data, Object lock) {
this.data = data;
this.lock = lock;
}
@Override
public void run() {
System.out.println("A start");
synchronized (lock) {
System.out.println("A Enter");
try {
TimeUnit.SECONDS.sleep(2);
data.setValue(666);
lock.notify();
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Main.java
package org.example.testwaitnotify;
public class Main {
public static void main(String[] args) {
Data data = new Data();
Object lock = new Object();
new ThreadA(data, lock).start();
System.out.println("Main start");
synchronized (lock) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Main read val=" + data.getValue());
}
}
}
理解:
在Main等着的时候,ThreadA即使notify了,只是说:Main处于就绪状态了,依然无法立刻获得锁。
依然要等到ThreadA执行完,退出synchronized后,才会释放锁,Main才会获得锁接着执行。
思考:
wait后是线程进入WAITING状态。 别的线程notify它后,应该是进入等待被cpu调度的状态,不知道为什么6个 状态没这个状态?(NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED)



