Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程中的通知_Java_Multithreading_Notifications - Fatal编程技术网

Java 线程中的通知

Java 线程中的通知,java,multithreading,notifications,Java,Multithreading,Notifications,一旦调用notify()方法,线程是否会像在wait()中一样立即放弃监视器。或者在调用notify()时,监视器是否会在方法执行完成后释放 调用notify()时,线程将进入哪个状态。等待或阻止状态?如果出现notify(),拥有监视器的线程将继续保持监视器 notify()。一旦线程获得监视器,它将退出wait()方法并继续 总之:一旦锁自然释放(脱离同步块/方法),涉及notify()/notifyAll()的线程将保持运行状态 通知的目的只是授权等待的线程将来有机会在该对象可用时立即获得

一旦调用notify()方法,线程是否会像在wait()中一样立即放弃监视器。或者在调用notify()时,监视器是否会在方法执行完成后释放


调用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) {
            }
        }
    }
}