notify()和notifyAll()

2024-03-11 21:58
文章标签 notify notifyall

本文主要是介绍notify()和notifyAll(),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

关于方法notify()和notifyAll()哪些说法是正确的?? 
请选出两个正确答案 
A)类Thread的一个实例有一个名为notify()的方法,该方法可以被调用。 
B)一个到方法notify()的调用将唤醒当前拥有对象锁定的线程。 
C)方法notify()是同步的。 
D)方法notifyAll()在类Thread中被定义的。 
E)当有超过一个线程在等待获得一个对象的锁定时,那么就无法确定notify()方法将通知哪个线程。      

A是对的,因为万物皆是类,Thread对象也是Object对象,所以也拥有notify方法,这种说法看似乎很怪,想想线程本身拥有这两个方法,未必有用,但在线程池中,线程做为一个对象进行存取控制的时候,就有用了。

B是错的。B的不是特别严谨,notify唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。另外还一个严重的说法错误,如果现有线程不是对象锁定的主人,那么将抛出一个IllegalMonitorStateException错误。

C是错的。notify方法在Object类中定义,但调用notify必须在同步代码块中调用。此方法不同步,但是如果现有线程不是对象锁定的主人,那么将抛出一个IllegalMonitorStateException,这两者理解上千万不要混淆在一起。在API中,方法的原型说明:     

public final void notify()
唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个  wait 方法,在对象的监视器上等待。

D是错的。明显是错的。

E是对的。对象在wait时会释放synchonrized的锁,被唤醒后会重新获取。notify() 是随机选择其中一个唤醒,其它仍然在wait。notifyAll() 是全部都唤醒,全部都尝试重获锁,当然只有其中一个会得到并继续执行,其它得不到锁的继续等待,但这时是等待锁而不是等待notify

 

 

notify()和notifyAll()都是Object对象用于通知处在等待该对象的线程的方法。两者的最大区别在于:
notifyAll使所有原来在该对象上等待被notify的线程统统退出wait的状态,变成等待该对象上的锁,一旦该对象被解锁,它们就会去竞争。notify则文明得多他只是选择一个wait状态线程进行通知,并使它获得该对象上的锁,但不惊动其他同样在等待被该对象notify的线程们,当第一个线程运行完毕以后释放对象上的锁此时如果该对象没有再次使用notify语句,则即便该对象已经空闲,其他wait状态等待的线程由于没有得到该对象的通知,继续处在wait状态,直到这个对象发出一个notify或notifyAll,它们等待的是被notify或notifyAll,而不是锁

import java.util.*;
class Widget{}
class WidgetMaker extends Thread{List finishedWidgets=new ArrayList();public void run(){try{while(true){Thread.sleep(5000);//act busyWidget w=new Widget();//也就是说需要5秒钟才能新产生一个Widget,这决定了一定要用notify而不是notifyAll//因为上面两行代码不是同步的,如果用notifyAll则所有线程都企图冲出wait状态//第一个线程得到了锁,并取走了Widget(这个过程的时间小于5秒,新的Widget还没有生成)//并且解开了锁,然后第二个线程获得锁(因为用了notifyAll其他线程不再等待notify语句//,而是等待finishedWidgets上的锁,一旦锁放开了,他们就会竞争运行),运行//finishedWidgets.remove(0),但是由于finishedWidgets现在还是空的,//于是产生异常//***********这就是为什么下面的那一句不能用notifyAll而是要用notifysynchronized(finishedWidgets){finishedWidgets.add(w);finishedWidgets.notify(); //这里只能是notify而不能是notifyAll}}}catch(InterruptedException e){}}public Widget waitForWidget(){synchronized(finishedWidgets){if(finishedWidgets.size()==0){try{finishedWidgets.wait();}catch(InterruptedException e){}}return finishedWidgets.remove(0);}}
}
public class WidgetUser extends Thread{private WidgetMaker maker;public WidgetUser(String name,WidgetMaker maker){super(name);this.maker=maker;}public void run(){Widget w=maker.waitForWidget();System.out.println(getName()+"got a widget");}public static void main(String[] args) {WidgetMaker maker=new WidgetMaker();maker.start();new WidgetUser("Lenny",maker).start();new WidgetUser("Moe",maker).start();new WidgetUser("Curly",maker).start();}
}

这篇关于notify()和notifyAll()的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/799202

相关文章

java join sleep wait notify notifyAll

sleep:在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。该线程不丢失任何监视器的所属权。  通过调用sleep使任务进入休眠状态,在这种情况下,任务在指定的时间内不会运行。 调用sleep的时候锁并没有被释放。 休眠  Java SE5引入了更加显示的sleep()版本作为TimeUnit类的一部分,这个方法允许你

java线程 yield,sleep,join,synchronized wait notify notifyAll,ReentrantLock lock condition, 生产者消费者

yield,sleep,join yield,join,sleep,join是Thread中的方法,不需要 在synchronized 代码块中调用,和synchronized 没关系,也不会释放锁。 Thread.sleep(100);Thread.yield();Thread t;t.join(); (1)yield()不一定保证让出cpu yield()只是使当前线程重新回

Java Lock 中使用 await() 和 signal()实现 wait()/notify()机制

** Java Lock 中使用 await() 和 signal()实现 wait()/notify()机制 ** 案例 import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;

synchronized wait()/notify 对比 ReentrantLock await()/signal()

结论 synchronized synchronized 配合 wait()/notify 无法实现精准唤醒线程 ReentrantLock ReentrantLock 配合 Condition await()/signal() 可以实现精准唤醒线程 (指唤醒指定的线程) ReentrantLock 如何实现精准唤醒线程 一个 lock 配合多个 Condition, 且

【线程间通信】sleep/wait/notify/notifyAll作用及使用

文章目录 背景wait代码及演示wait、notify代码及演示notifyAll()代码及演示 背景 在多线程开发过程中,由于线程最大的问题就是抢占式执行,随机调度, 因此线程之间执行的先后顺序难以预知。 但是实际开发中有时候我们希望合理的协调多个线程之间的执行先后顺序,让线程主动阻塞,主动放弃CPU,从而控制线程之间的执行顺序 ,去协调完成工作,怎么去控制线程之间的执行

java notify和notifyAll的区别

java中的notify和notifyAll有什么区别? 关注问题 写回答 Java Java 编程 Java EE Java 程序员 java中的notify和notifyAll有什么区别? 关注者 56 被浏览 6466 ​添

[Raspberry Pi]如何利用docker執行motioneye,並利用Line Notify取得即時通知和照片?

[Motioneye]How to setup motion detection and send message/image for Line Notify 無意間,翻了一本關於樹莓派的書籍,除了樹莓派的簡介和應用外,也包含初階和高階的Linux運作邏輯,書籍結構相當完整,也因此需要花時間細細體會其內容。其在樹莓派的應用內容,提及一款開源影像監視軟體motioneye,motioney

Java多线程 notify()与wait() 使用方法

> wait () 立刻停止该线程,释放锁,让其他等等获取该锁的线程执行 > notify() 发出通知停止该线程, 但 notify() 不会立刻停止该线程 当前代码块执全部行结束后,释放锁,让等待的线程获取锁,再执行 > 案例 import java.util.ArrayList;import java.util.List;class Service {private final O

API学习java.lang.Object.notify

package com.wonders.week01.object;/*** JDK1.7* Notify* (1)java.lang.Object* (2)方法的访问权限修饰符是public* (3)方法是没有返回值的,所以返回值类型声明为void* (4)该方法是由final修饰的,所以继承自Object类但是不可以重写该方法。* (5)如果当前线程不是当前对象的监控者,会抛出这个异常Ille