wait(),notify(),notifyAll()不属于Thread类,而是属于Object基础类,也就是说每个对像都有wait(),notify(),notifyAll()的功能.因为都个对像都有锁,锁是每个对像的基础,当然操作锁的方法也是最基础了。
wait导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或被其他线程中断。wait只能由持有对像锁的线程来调用。
notify唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程(随机)。直到当前的线程放弃此
对象上的锁,才能继续执行被唤醒的线程。同Wait方法一样,notify只能由持有对像锁的线程来调用.notifyall也一样,不同的是
notifyall会唤配所有在此对象锁上等待的线程。
"只能由持有对像锁的线程来调用"说明wait方法与notify方法必须在同步块内执行,即synchronized(obj)之内.再者synchronized代码块内没有锁是寸步不行的,所以线程要继续执行必须获得锁。相辅相成。
看一个很经典的例子(生产者与消费者):
package
ProductAndConsume;
import
java.util.List;
public
class
Consume implements
Runnable{
private
List container = null
;
private
int
count;
public
Consume(List lst){
this
.container = lst;
}
public
void
run() {
while
(true
){
synchronized
(container) {
if
(container.size()== 0){
try
{
container.wait();//容器为空,放弃锁,等待生产
} catch
(InterruptedException e) {
e.printStackTrace();
}
}
try
{
Thread.sleep(100);
} catch
(InterruptedException e) {
e.printStackTrace();
}
container.remove(0);
container.notify();
System.out.println("我吃了"
+(++count)+"个"
);
}
}
}
}
package
ProductAndConsume;
import
java.util.List;
public
class
Product implements
Runnable {
private
List container = null
;
private
int
count;
public
Product(List lst) {
this
.container = lst;
}
public
void
run() {
while
(true
) {
synchronized
(container) {
if
(container.size() > MultiThread.MAX) {
//如果容器超过了最大值,就不要在生产了,等待消费
try
{
container.wait();
} catch
(InterruptedException e) {
e.printStackTrace();
}
}
try
{
Thread.sleep(100);
} catch
(InterruptedException e) {
e.printStackTrace();
}
container.add(new
Object());
container.notify();
System.out.println("我生产了"
+(++count)+"个"
);
}
}
}
}
package
ProductAndConsume;
import
java.util.ArrayList;
import
java.util.List;
public
class
MultiThread {
private
List container = new
ArrayList();
public
final
static
int
MAX = 5;
public
static
void
main(String args[]){
MultiThread m = new
MultiThread();
new
Thread(new
Consume(m.getContainer())).start();
new
Thread(new
Product(m.getContainer())).start();
new
Thread(new
Consume(m.getContainer())).start();
new
Thread(new
Product(m.getContainer())).start();
}
public
List getContainer() {
return
container;
}
public
void
setContainer(List container) {
this
.container = container;
}
分享到:
相关推荐
源码—Java多线程5—死锁和wait notify notifyAll
总结一下,`wait()`, `notify()`, 和 `notifyAll()` 是Java多线程编程中的核心工具,它们与`synchronized`关键字一起,为线程间的协作提供了强大的支持。理解并熟练掌握这些概念,对于编写高效、安全的多线程程序至...
Java多线程编程是开发高并发应用的关键技术之一,它允许程序同时执行多个任务,提高系统资源利用率。在Java中,`wait()` 和 `notify()` 方法是实现线程间通信和协作的重要工具,它们属于 `java.lang.Object` 类,这...
Java多线程中wait、notify、notifyAll使用详解 Java中多线程编程中,wait、notify、notifyAll三个方法是非常重要的,它们都是Object对象的方法,用于线程之间的通信。下面我们将详细介绍这三个方法的使用和作用。 ...
_java多线程wait、notify机制详解_ 在Java多线程编程中,wait和notify是两个非常重要的机制,用于实现线程之间的通信和同步。在本文中,我们将通过示例代码详细介绍Java多线程wait和notify的使用,帮助读者更好地...
Java之wait和notify的用法详解 在Java多线程编程中,wait和notify是两个非常重要的方法,它们都是Object类的方法,用于线程之间的通信和同步。下面我们将详细解释wait和notify的用法。 wait方法 wait方法是Object...
wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。 在 Java 中可以用 wait、notify 和 notifyAll 来实现...
"Java多线程之wait(),notify(),notifyAll()" 在Java多线程编程中,wait(),notify(),notifyAll()是三个非常重要的方法,它们都是Object类中的方法,意味着每个对象都有这些方法。这些方法是用来实现线程之间的通信和...
本文将深入探讨Java中的wait()、notify()和notifyAll()方法,以及synchronized关键字和原子操作在多线程环境中的应用。 1. **wait()方法**: - wait()是Object类的一个方法,它的作用是让当前线程暂停执行并释放它...
同样,当线程使用wait方法时,它会主动释放锁并进入等待状态,直到其他线程调用notify或notifyAll方法来唤醒它。此外,sleep方法可以使线程进入阻塞状态一段时间,而join方法则允许一个线程等待另一个线程完成其任务...
Java多线程通讯之wait、notify的区别详解 Java多线程通讯是指在多线程编程中,线程之间如何进行通讯和同步的问题。其中,wait和notify是两个非常重要的方法,用于控制线程的状态和同步。 wait方法: wait方法是...
- 等待/通知机制:`wait()`, `notify()`, `notifyAll()`方法用于线程间的通信。这些方法必须在`synchronized`环境中使用,避免线程安全问题。 - `volatile`关键字:用于标记共享变量,确保多线程环境下的可见性和...
此外,书中还深入探讨了线程安全问题,包括共享资源的并发访问、死锁、活锁、饥饿等问题,以及如何通过同步机制(如synchronized关键字、wait()、notify()和notifyAll()方法)来解决这些问题。Java内存模型(JMM)也...
wait set——线程的休息室 wait方法——把线程放入wait set notify方法——从wait set拿出线程 notifyAll方法——从wait set拿出所有线程 wait、notify、notifyAll是Object类的方法 线程的状态移转 跟线程有关的其他...
Java中,可以通过wait()、notify()和notifyAll()这三个Object类的方法来实现线程间的通信。这些方法必须在同步环境中使用,否则会抛出异常。此外,Java 5引入了BlockingQueue阻塞队列,它是一种线程安全的数据结构,...
在Java编程中,多线程并发是提升程序执行效率、充分利用多核处理器资源的重要手段。本文将基于"java 多线程并发实例"这个主题,深入探讨Java中的多线程并发概念及其应用。 首先,我们要了解Java中的线程。线程是...
Java中的多线程编程是构建高效并发应用的关键技术之一,其中`wait()`、`notify()`和`notifyAll()`是Java对象锁机制中的三个关键方法,它们位于`java.lang.Object`类中,主要用于线程间通信。本文将深入探讨`notify()...
Java多线程机制是Java编程中至关重要的一部分,它允许程序同时执行多个任务,提升应用程序的效率和响应性。以下是对各个知识点的详细说明: 9.1 Java中的线程: Java程序中的线程是在操作系统级别的线程基础上进行...
`synchronized`关键字、`wait()`和`notify()`方法是Java多线程中用于控制并发访问共享资源的重要工具,它们是Java内存模型(JMM)的一部分,主要用于解决线程间的同步问题。 一、`synchronized`关键字 `...
3. **线程同步与并发控制**:论文会深入讲解JAVA中的线程同步机制,如synchronized关键字、wait()、notify()和notifyAll()方法,以及Lock接口和ReentrantLock类的使用。此外,可能会探讨并发工具类,如Semaphore、...