Ale*_*lls 45 java multithreading notify wait
如何在不是线程的对象上调用wait()
和notify()
方法?那真的没有意义,是吗?
当然,它必须有意义,因为这两种方法可用于所有Java对象.有人可以提供解释吗?我无法理解如何使用wait()
和之间的线程之间进行通信notify()
.
Nat*_*hes 37
锁定是关于保护共享数据.
锁定在受保护的数据结构上.线程是访问数据结构的东西.锁定在数据结构对象上,以防止线程以不安全的方式访问数据结构.
任何对象都可以用作内部锁(意思是与之结合使用synchronized
).这样,您可以通过将synchronized修饰符添加到访问共享数据的方法来保护对任何对象的访问.
该wait
和notify
方法被称为上正在使用的锁对象.锁是一个共享的通信点:
当一个有锁的线程调用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();
您可以根据需要使用静态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我知道如果我错了你的问题(英语不是我的母语)
想想一个现实的例子,一个洗手间。当您想在办公室使用洗手间时,有两种选择可确保一旦使用洗手间,其他任何人都不会进入洗手间。
您会选择哪个?
是的,在Javaland中也是一样!
所以在上面的故事中
因此,就像在现实生活中一样,当您有一些私人业务时,您就可以锁定该对象。当您完成该对象的操作后,您就放开了锁!
(是的,这是对发生的情况的非常简单的描述。当然,实际概念与此稍有不同,但这是一个起点)