在等待之前通知

时间:2014-02-13 21:55:07

标签: java multithreading

当我阅读wait()notify方法时,我正在阅读有关多线程的内容。我怀疑如果notify()方法在wait()方法之前完成,会发生什么。

Wait()方法会再次等待?或之前的通知是否有效进一步移动?

2 个答案:

答案 0 :(得分:0)

Object#wait()的javadoc说

  

导致当前线程等待,直到另一个线程调用   java.lang.Object.notify()方法或java.lang.Object.notifyAll()   此对象的方法。

所以,当你打电话

someObject.wait();

它将等待跟随调用

someObject.notify(); // or notifyAll()

答案 1 :(得分:0)

如果在执行wait()方法之前调用notify()方法,则等待线程将永远保持等待状态。 在这样的情况下,如果不能保证会得到通知,则始终等待一段时间,即不使用wait(milliSecond)/ wait(milliSecond,NanoSecond)而不是使用wait(),后者将等待无限时间并且仅继续接到通知时会更进一步。

请参考下面的示例以更好地理解-

class MainThread extends Thread {
public void run() {
    ChildThread ct = new ChildThread();
    ct.start();
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    synchronized (ct) {
        System.out.println("Main Thread started");
        try {

            ct.wait();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("Main THread controlled returned");
        System.out.println(ct.total);
    }
}}

class ChildThread extends Thread {
int total = 0;

public void run() {
    synchronized (this) {
        System.out.println("Child Thread started");
        for (int i = 0; i < 100; i++) {
            total++;
        }
        System.out.println("Child Thread passed notify");
        this.notify();
    }
}}

public class HelloWorld {

public static void main(String args[]) throws InterruptedException, IOException {

    MainThread mt = new MainThread();

    mt.start();
}}