首先看下官方的解释:
void notify()
唤醒在此对象监视器上等待的单个线程。
void notifyAll()
唤醒在此对象监视器上等待的所有线程。
void wait()
导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。
下面是一段实例:
public class OtherObject {
public synchronized void await(){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void anotify(){
notifyAll();
}
}
public class ShareDataThread implements Runnable{
private static String name;
/**
* wait()导致当前的线程等待,直到其他线程调用此对象(the same object
* like: OtherObject)的 notify() 方法或 notifyAll() 方法。
**/
private static OtherObject oo = new OtherObject();
@Override
public void run() {
name = "simon";
oo.anotify();
}
public static void main(String[] args){
Thread t = new Thread(new ShareDataThread());
t.start();
//method 1
/*try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}*/
//method 2
while(name == null){
System.out.println("before");
oo.await();
}
System.out.println(name);
}
}
注意上面的 wait() 和 notify()/notifyAll() 必须在调用同一个实例对象的。
因为在统一实例对象之间这两个方法才是相关联的,wait()方法执行后,通过notify()/notifyAll()才能唤醒wait()方法。
分享到:
相关推荐
`java.lang.RuntimeException: Problem`是异常的信息,不会直接打印到控制台。 - **选项B**:错误。`run. java.lang.RuntimeException: Problem`虽然包含了`run.`,但是没有正确地表示出`End of method.`的输出顺序...
通过这些解析,我们可以了解到Java多线程编程的一些基本概念和常见陷阱,例如如何处理异常、死锁的预防以及`synchronized`和`wait()/notify()`的正确使用方式等。对于准备SCJP认证考试的学习者来说,掌握这些知识点...
2. **String 类**:`String`类虽然经常用于基础数据处理,但实际上它不是基本数据类型,而是引用类型,属于`java.lang`包下的一个类。`String`类是不可变的,即一旦创建了一个`String`对象,它的内容就不能更改。 3....
- `Exception in thread "Thread-0" java.lang.RuntimeException: Problem` - **解析**: - 当主线程启动后,会先打印 `Endofmethod.`。 - 启动的线程执行 `run()` 方法,打印 `run.` 并抛出异常。 - 异常被捕获...
根据给定文件的信息,我们可以深入探讨与SCJP(Sun Certified Programmer for the Java Platform)认证相关的几个关键知识点,尤其是关于多线程、死锁以及异常处理的深入解析。 ### 多线程异常处理 #### 示例代码...
其中可能的情况是当线程启动后,输出"run.",接着抛出异常"java.lang.RuntimeException:Problem"。在多线程编程中,当线程执行到抛出异常的点时,会终止执行,其他线程继续运行。这题显示了在Java多线程中异常处理的...
- `sleep()` 方法是 `java.lang.Thread` 类的一个静态方法,它可以直接作用于当前正在执行的线程。 - `wait()` 方法是 `java.lang.Object` 类的一个实例方法,它需要作用于一个特定的对象,使得调用该方法的线程...
java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 6、int 和 Integer 有什么区别 Java 提供两种不同的类型:引用类型和原始类型(或...