如何在非线程的对象上调用wait()和notify()方法?

Ale*_*lls 45 java multithreading notify wait

如何在不是线程的对象上调用wait()notify()方法?那真的没有意义,是吗?

当然,它必须有意义,因为这两种方法可用于所有Java对象.有人可以提供解释吗?我无法理解如何使用wait()和之间的线程之间进行通信notify().

Nat*_*hes 37

锁定是关于保护共享数据.

锁定在受保护的数据结构上.线程是访问数据结构的东西.锁定在数据结构对象上,以防止线程以不安全的方式访问数据结构.

任何对象都可以用作内部锁(意思是与之结合使用synchronized).这样,您可以通过将synchronized修饰符添加到访问共享数据的方法来保护对任何对象的访问.

waitnotify方法被称为上正在使用的锁对象.锁是一个共享的通信点:

  • 当一个有锁的线程调用notifyAll它时,等待同一个锁的其他线程会收到通知.当一个有锁的线程调用notify它时,其中一个等待同一个锁的线程会收到通知.

  • 当一个有锁wait的线程调用它时,线程释放锁并进入休眠状态,直到a)它收到通知,或b)它只是任意唤醒("虚假唤醒"); 等待线程仍然停留在呼叫等待,直到它醒来由于这两个原因之一,那么线程必须重新获取锁,然后才能退出wait方法.

请参阅有关受保护块Oracle教程,Drop类是共享数据结构,使用Producer和Consumer runnables的线程正在访问它.锁定Drop对象控制线程如何访问Drop对象的数据.

线程在JVM实现中被用作锁,建议应用程序开发人员避免使用线程作为锁.例如,Thread.join文档说:

此实现使用this.wait调用this.isAlive的循环.当一个线程终止时,将调用this.notifyAll方法.建议应用程序不要在Thread实例上使用wait,notify或notifyAll.

Java 5引入了显式锁实现java.util.concurrent.locks.Lock.这些比隐式锁更灵活; 有类似于wait和notify(等待和信号)的方法,但是它们在条件上,而不在锁上.具有多个条件使得可以仅针对等待特定类型的通知的那些线程.


Ale*_*lex 24

您可以使用wait()notify()同步逻辑.举个例子

synchronized (lock) {
    lock.wait(); // Will block until lock.notify() is called on another thread.
}

// Somewhere else...
...
synchronized (lock) {
    lock.notify(); // Will wake up lock.wait()
}
Run Code Online (Sandbox Code Playgroud)

lock属于分类部件Object lock = new Object();

  • 这种事情的简单用法是消息生成者/消费者,其中consumer.wait(); 直到producer.notify(); (4认同)
  • 我认为这是最好的例子之一:http://www.javamex.com/tutorials/wait_notify_how_to.shtml (2认同)

Pet*_*ila 5

您可以根据需要使用静态Thread类方法停止线程sleep().

public class Main {
    //some code here

    //Thre thread will sleep for 5sec.
    Thread.sleep(5000);   
}
Run Code Online (Sandbox Code Playgroud)

如果要停止某些对象,则需要在syncronized块内调用此方法.

public class Main {

//some code

public void waitObject(Object object) throws InterruptedException {
    synchronized(object) {
        object.wait();
    }
}

public void notifyObject(Object object) throws InterruptedException {
    synchronized(object) {
        object.notify();
    }
}
Run Code Online (Sandbox Code Playgroud)

}

PS我知道如果我错了你的问题(英语不是我的母语)


Ish*_*iri 5

想想一个现实的例子,一个洗手间。当您想在办公室使用洗手间时,有两种选择可确保一旦使用洗手间,其他任何人都不会进入洗手间。

  1. 锁上洗手间门,以便其他所有人在尝试打开门时都会知道其他人正在使用它
  2. 去办公室里的每个人,将他们锁在椅子(或桌子,或其他东西)上,去洗手间。

您会选择哪个?

是的,在Javaland中也是一样!

所以在上面的故事中

  • 洗手间=您想要锁定的对象(仅您需要使用)
  • 您的员工同事=您要保留的其他线程

因此,就像在现实生活中一样,当您有一些私人业务时,您就可以锁定该对象。当您完成该对象的操作后,您就放开了锁!

(是的,这是对发生的情况的非常简单的描述。当然,实际概念与此稍有不同,但这是一个起点)