Java 线程中的通知
一旦调用notify()方法,线程是否会像在wait()中一样立即放弃监视器。或者在调用notify()时,监视器是否会在方法执行完成后释放Java 线程中的通知,java,multithreading,notifications,Java,Multithreading,Notifications,一旦调用notify()方法,线程是否会像在wait()中一样立即放弃监视器。或者在调用notify()时,监视器是否会在方法执行完成后释放 调用notify()时,线程将进入哪个状态。等待或阻止状态?如果出现notify(),拥有监视器的线程将继续保持监视器 notify()。一旦线程获得监视器,它将退出wait()方法并继续 总之:一旦锁自然释放(脱离同步块/方法),涉及notify()/notifyAll()的线程将保持运行状态 通知的目的只是授权等待的线程将来有机会在该对象可用时立即获得
调用notify()时,线程将进入哪个状态。等待或阻止状态?如果出现
notify()
,拥有监视器的线程将继续保持监视器
notify()。一旦线程获得监视器,它将退出wait()
方法并继续
总之:一旦锁自然释放(脱离同步块/方法),涉及notify()
/notifyAll()
的线程将保持运行状态
通知的目的只是授权等待的线程将来有机会在该对象可用时立即获得锁。只要该对象在该对象上同步,线程就会持有该对象的监视器。通知的线程将移动到BLOCKED
状态,并且在拥有该状态的线程通过离开先前持有监视器的同步块/方法释放监视器后,该线程将获得监视器
例如,如果线程A在调用lock.wait()
时阻塞,而线程B调用lock.notify()
,则线程A将离开等待
状态并进入阻塞
状态**,但线程A不会恢复执行(即进入可运行
状态)直到线程B离开锁的同步块
**假设没有其他线程等待lock
,因为通知线程的顺序不能保证,这就是为什么您应该使用notifyAll()
作为规则(除非您知道自己在做什么并且有充分的理由不这样做)
使用代码:
public class ThreadStateTest {
private static final Object lock = new Object();
public static void main(String[] args) {
synchronized (lock) {
new Thread(new RunnableTest()).start();
try {
Thread.sleep(1000);
System.out.println("this will print first");
lock.wait();
System.out.println("this will print third");
} catch (InterruptedException ex) {
}
}
}
private static class RunnableTest implements Runnable {
@Override
public void run() {
try {
synchronized (lock) {
lock.notifyAll();
Thread.sleep(1000);
System.out.println("this will print second");
}
Thread.sleep(1000);
System.out.println("this will print fourth");
} catch (InterruptedException ex) {
}
}
}
}