`
isiqi
  • 浏览: 16548495 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

notify 和wait

阅读更多

要点:

1、 两者必须在synchronized内使用

2、wait使线程暂停执行,notify是线程得以继续执行

3、解决对同一数据对象,多线程访问的一致性

4、同步块代码执行时,其他线程序对同一对象的同步块代码被阻塞而不会执行,只有一个线程的同步块执行完毕,才会轮到其他线程的同步块执行

类Product

import java.util.List;

/**
* @author Administrator
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class Product implements Runnable {

private List container = null;

private int count;

public Product(List lst) {
this.container = lst;
}

public void run() {
while (true) {
System.out.println("container.size()=" + container.size());
synchronized (container) {
if (container.size() > MultiThread.MAX) {
try {
System.out.println("Exceed the MAX limit.");
container.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
container.add(new Object());
container.notify(); //自动通知,快速生产
System.out.println("我生产了" + (++count) + "个");
}

// try {
// Thread.sleep(10);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }

//container.add(new Object());
//container.notify();
//System.out.println("我生产了" + (++count) + "个");
}
}
}

}

类Consume

import java.util.List;

/**
* @author Administrator
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
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 {
// System.out.println("container.size=0");
// container.wait();//放弃锁
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// }else{
// container.remove(0);
// //container.notify();
// System.out.println("我吃了" + (++count) + "个");
// }

if(container.size() > 0){
container.remove(0);
// //container.notify();
System.out.println(Thread.currentThread().getId() + "我吃了" + (++count) + "个,还剩" + container.size());
}else{
container.notify();
}

try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}

//container.remove(0);
//container.notify();
//System.out.println("我吃了" + (++count) + "个");
}
}
}

}

类MultiThread

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;
}

}

分享到:
评论

相关推荐

    深入理解Wait、Notify和Wait与sleep区别

    首先,`wait()`, `notify()`和`notifyAll()`是Object类中的方法,它们主要用于线程间通信和协作。这些方法只能在同步环境中(如`synchronized`块或方法)使用,否则会抛出`IllegalMonitorStateException`。它们的...

    wait和notify讲解

    wait和notify讲解

    java中几个notify、wait使用实例

    为了实现这一点,我们可以使用`wait()`和`notify()`来控制线程的执行顺序。具体实现如下: 1. 在每个线程中,使用`synchronized`关键字锁定同一个对象。 2. 当一个线程完成其打印任务后,调用`notify()`方法唤醒另...

    Java 同步方式 wait和notify/notifyall

    在Java中,`wait()`, `notify()`, 和 `notifyAll()` 是Java Object类的三个方法,它们在实现线程间通信和协作时扮演着关键角色。这些方法主要用于解决线程等待和唤醒的问题,是基于Java Monitor(监视器)模型的。 ...

    Java多线程wait和notify

    在Java中,`wait()` 和 `notify()` 方法是实现线程间通信和协作的重要工具,它们属于 `java.lang.Object` 类,这意味着所有类都默认继承了这两个方法。本文将详细探讨如何使用 `wait()` 和 `notify()` 来控制子线程...

    42.线程间的通信-wait与notify-wait(long)的使用.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    java之wait,notify的用法([ 详解+实例 ])

    Java之wait和notify的用法详解 在Java多线程编程中,wait和notify是两个非常重要的方法,它们都是Object类的方法,用于线程之间的通信和同步。下面我们将详细解释wait和notify的用法。 wait方法 wait方法是Object...

    wait_notify_demo

    `wait()`、`notify()`和`notifyAll()`是Java中的三个关键字,它们属于Object类的方法,主要用于线程间的通信,尤其在实现生产者消费者模式时发挥着重要作用。本文将深入探讨这些方法以及如何在实际场景中应用它们。 ...

    Java多线程中wait、notify、notifyAll使用详解

    5. notify 和wait 的顺序不能错,如果A线程先执行notify方法,B线程在执行wait方法,那么B线程是无法被唤醒的。 6. notify 和 notifyAll的区别notify方法只唤醒一个等待(对象的)线程并使该线程开始执行,而...

    源码—Java多线程5—死锁和wait notify notifyAll

    源码—Java多线程5—死锁和wait notify notifyAll

    wait()、notify()和notifyAll()方法2---马克-to-win java视频

    wait()、notify()和notifyAll()方法2---马克-to-win java视频

    39.线程间的通信-wait与notify-wait方法自动释放锁与notify方法不会释放锁.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    一个理解wait()与notify()的例子

    ### 一个理解wait()与notify()的例子 #### 知识点概述 本文旨在解析一个具体的Java多线程示例代码,以帮助读者更好地理解`wait()`与`notify()`方法的作用及其实现机制。这两个方法是Java中实现线程间通信的重要...

    Java的sychronized、wait和notify范例

    `synchronized`关键字、`wait()`和`notify()`方法是Java多线程中用于控制并发访问共享资源的重要工具,它们是Java内存模型(JMM)的一部分,主要用于解决线程间的同步问题。 一、`synchronized`关键字 `...

    wait()、notify()和notifyAll()方法1---马克-to-win java视频

    wait()、notify()和notifyAll()方法1---马克-to-win java视频

    主线程去控制子线程wait与notify

    在Java多线程编程中,`wait()`和`notify()`是两个非常重要的方法,它们用于线程间的协作和通信。这两个方法是Java语言中的Object类提供的,因此所有的对象都可以使用。在本文中,我们将深入探讨如何使用主线程来控制...

    Java 同步锁 wait notify 学习心得

    标题和描述概述的知识点主要集中在Java的多线程机制中,特别是`wait`和`notify`方法在同步锁中的应用。这些方法对于控制线程之间的交互至关重要,尤其是在资源有限或需要确保数据一致性的情况下。 ### Java同步锁...

    如何在Java中正确使用 wait, notify 和 notifyAll

    wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。  在 Java 中可以用 wait、notify 和 notifyAll 来实现...

    38.线程间的通信-wait与notify-wait与notifty机制的实现.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    浅谈java多线程wait,notify

    在Java多线程编程中,wait和notify是两个非常重要的机制,用于实现线程之间的通信和同步。在本文中,我们将通过示例代码详细介绍Java多线程wait和notify的使用,帮助读者更好地理解和掌握这两个机制。 wait机制 在...

Global site tag (gtag.js) - Google Analytics