Java线程notify()方法

时间:2014-02-04 04:48:15

标签: java multithreading

考虑有两个线程正在等待执行synchronized块。现在有一个机会在这种情况下等待我真的需要调用notify()吗?我认为当同步块执行完成其他线程会释放锁吗? notify()方法的确切用途是什么?

线程专家请解释一下?

5 个答案:

答案 0 :(得分:1)

不,在这种情况下你不需要使用notify()。你是对的,在释放锁之后,必须等待获取锁的线程会自动继续。

notify()方法与wait()方法结合使用。当一个线程调用wait()时,它可以释放锁并开始等待。可以结束等待的条件之一是另一个线程调用notify()时。必须在当前线程为wait()的实例上调用notify()synchronized

例如,这可用于在两个线程之间创建通道,其中一个线程正在消耗另一个线程生成的信息。如果消费者没有要处理的信息,它可能会wait(),直到生产者notify()有更多数据可用。

答案 1 :(得分:0)

当一个线程进入synchronized块并且调用wait时,释放进入synchronized块时获取的锁,并且线程等待其他线程通知它,在这种情况下它将重新获取锁并继续。当线程再次释放时来自同步块。

答案 2 :(得分:0)

来自doc

  

唤醒正在此对象监视器上等待的单个线程。如果   任何线程都在等待这个对象,其中一个被选中   惊醒。选择是任意的,由酌情决定   实现。线程通过调用一个线程在对象的监视器上等待   等待方法。

所以如果一个对象正在等待调用wait方法。那么你可以使用notify唤醒它们。

答案 3 :(得分:0)

<强>描述

  

java.lang.Object.notify()唤醒正在等待的单个线程   在这个对象的监视器上。如果任何线程正在等待此对象,   其中一个被选中被唤醒。选择是任意的   由实施决定。一个线程等待   通过调用其中一个等待方法来监视对象的监视器。

有关更多信息,请参阅以下链接。

notify()

Documentation

Doc

我希望它会对你有所帮助。

答案 4 :(得分:0)

就像你使用多线程一样,方法是同步的,这意味着它将在所有线程之间共享,但任何线程将在执行另一个线程后使用它。 如果任何线程发生任何更改,那么通过使用下面的通知方法可以看到所有的代码就是这样的例子:

class Detail {
    public String name = "", sername = "";
    Scanner sc;

    public synchronized String getData() {

        try {
            wait();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return name+""+sername;
    }

    public synchronized void show() {
        try {
            name = "hello";
            sername = "hii";
            Thread.sleep(1000);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        notify();


    }

}

class Data1 extends Thread {
    Detail detail;
    public Data1(Detail detail1)
    {
    //  super("1");
        this.detail = detail1;
        start();
    }

    public void run()
    {
        System.out.println("name is :"+detail.getData());

    }
}

class Data2 extends Thread {
    Detail detail2;
    public Data2(Detail detail1)
    {
        //super("2");
        this.detail2 = detail1;
        start();
    }

    public void run()
    {
        detail2.show();

    }
}

public class SyncDemo {

    public static void main(String ar[])
    {
        Detail det = new Detail();
        Data1 d1=  new Data1(det);
        Data2 d2=  new Data2(det);

    }

}