`
逸清河
  • 浏览: 10882 次
社区版块
存档分类
最新评论

java wait notify

阅读更多
import java.util.ArrayList;
import java.util.List;

public class WaitNotify extends Thread {
   
private String flag="false";

private List<String> list=new ArrayList<String>();

public static void main(String[] args) {
     
    WaitNotify t = new WaitNotify();
   
    //正确的用法,wait跟notify的用法肯定是在不同的2个线程里面,而且wait跟notify必须监控同一个句柄或者指针自身不变的资源
    //notify线程一定不能一直占着锁
    RightWaitThread rw =t.new RightWaitThread();
    rw.start();
   
    RightNotifyThread pd =t.new RightNotifyThread();
    pd.start();
   
   
    //以下是没有意义(监控的没有意义) 的用法
    /*NomanningWaitThread wt =t.new NomanningWaitThread();
    wt.start();
   
    NomanningNotifyThread nt =t.new NomanningNotifyThread();
    nt.start();*/
    /*
    //以下是错误 的用法,监控了一个变化的对象
    ChangeWaitThread ct =t.new ChangeWaitThread();
    ct.start();
   
    ChangeNotifyThread cn =t.new ChangeNotifyThread();
    cn.start();
   
    //以下是错误 的用法,这个线程完全阻塞了,所以不能走下去,notify那里根本走不到,换句话说不管怎么用nofity块一定要能运行到
   
   
        t.waitThis();
        System.out.println("running here...");
        t.start();//t线程开始执行
        t.notifiyThis();*/
 
    }  
    
     //生产消费
    class RightWaitThread extends Thread
    {
    public void run() {
    synchronized (list) {
try {
while(true)
{
Thread.sleep(1000);
System.out.println("while consume RightWaitThread ...");
if(list.isEmpty())
{
list.wait();
String e=list.get(0);
list.remove(0);
System.out.println("consume element:"+e+"   list size:"+list.size());
}
}

} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}   
    }   
    }
   
    class RightNotifyThread extends Thread
    {
    public void run() {
    try {
    while(true)
    {
    Thread.sleep(5000);
doWork();
    }       
}

catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
    }   
    public void doWork() {
synchronized (list) {
// while(true) //这里notify一定不能一直占着锁,应该有外部生产者觉得要做的作业,这里应该是一个独立的作业
//{
System.out.println("while produce RightNotifyThread ...");
list.add("hello");
       list.notify();
// }        
}
}   
    }
   
    //有问题的用法,nontify被阻塞了
    private void waitThis()
    {
    synchronized (this) {
            try {
                System.out.println("waitThis wait for t to complete...");
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("total:" + this.total);
        }
    }
   
    private void notifiyThis()
    {
    synchronized (this) {           
                System.out.println("notifiyThis notifiy all...");
                this.notify();           
        }
    }

    int total;

    public void run() {
        synchronized (this) {//运行期间保持锁
        System.out.println("in");
            for (int i = 0; i < 100; i++) {
                total += i;
            }
            System.out.println(total);
            this.notify();//唤醒等待此对象锁的一个线程
        }
    }
   
    // 这个用法是没有问题的,因为没有监控对象没有比那话,但是没有意义
    
    class NomanningWaitThread extends Thread
    {
    public void run() {
    synchronized (flag) {
try {
System.out.println("begin NomanningWaitThread wait for t to complete...");
flag.wait();
System.out.println("after NomanningWaitThread wait for t to complete...");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
   
    }
   
    }
   
    class NomanningNotifyThread extends Thread
    {
    public void run() {
    try {
    synchronized (flag) {
    Thread.sleep(5000);
      System.out.println("NomanningNotifyThread notify...");
    flag.notify();
}

} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
    }   
    }
   
     //这个用法是没有问题的,因为没有监控对象没有比那话,但是没有意义   
    class ChangeWaitThread extends Thread
    {
    public void run() {
    synchronized (flag) {
try {
while(true)
{
System.out.println("begin ChangeWaitThread wait for t to complete...");
flag.wait();
System.out.println("after ChangeWaitThread wait for t to complete...");
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}   
    }   
    }
   
   
     // 这个用法是没有问题的,因为没有监控对象没有比那话,但是没有意义   
    class ChangeNotifyThread extends Thread
    {
    public void run() {
    try {
    synchronized (flag) {
    while(true)   
    {
    flag="true";
    Thread.sleep(5000);
       System.out.println("ChangeNotifyThread notify...");
       flag.notify();
    }   
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
    }  
    }
}



查看kill -3线程堆栈,可以看到监视的是同一个对象


Full thread dump Java HotSpot(TM) 64-Bit Server VM (1.5.0_22-b03 mixed mode):

"DestroyJavaVM" prio=1 tid=0x00000000401157e0 nid=0x3285 waiting on condition [0x0000000000000000..0x00007fffce241c70]

"Thread-2" prio=1 tid=0x00002aaaaacd0190 nid=0x3298 waiting on condition [0x0000000041463000..0x0000000041463b20]
at java.lang.Thread.sleep(Native Method)
at WaitNotify$RightNotifyThread.run(WaitNotify.java:82)
- locked <0x00002ade13e531b8> (a java.util.ArrayList)

"Thread-1" prio=1 tid=0x00002aaaaaccf0f0 nid=0x3297 in Object.wait() [0x0000000041362000..0x0000000041362ca0]
at java.lang.Object.wait(Native Method)
- waiting on <0x00002ade13e531b8> (a java.util.ArrayList)
at java.lang.Object.wait(Object.java:474)
at WaitNotify$RightWaitThread.run(WaitNotify.java:60)
- locked <0x00002ade13e531b8> (a java.util.ArrayList)
分享到:
评论

相关推荐

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

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

    wait_notify_demo

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

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

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

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

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

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

    Java多线程中wait、notify、notifyAll使用详解 Java中多线程编程中,wait、notify、notifyAll三个方法是非常重要的,它们都是Object对象的方法,用于线程之间的通信。下面我们将详细介绍这三个方法的使用和作用。 ...

    Java多线程wait和notify

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

    Java 同步方式 wait和notify/notifyall

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

    Java 同步锁 wait notify 学习心得

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

    详解Java程序并发的Wait-Notify机制

    Java程序并发的Wait-Notify机制是Java多线程编程中的一种重要同步工具,它允许线程之间通过共享对象进行通信和协作。这个机制基于Java的内置锁(也称为监视器锁),通常与`synchronized`关键字一起使用。在Java中,`...

    JAVAWAIT和NOTIFY的用法.pdf

    JAVAWAIT和NOTIFY的用法.pdf

    Java的sychronized、wait和notify范例

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

    java代码-wait-notify 生产者消费者

    7. **Java并发工具类**:除了`wait()`和`notify()`,Java并发库提供了更高级的工具,如`BlockingQueue`,它提供了线程安全的队列操作,简化了生产者消费者模式的实现,避免了直接使用`wait()`和`notify()`可能导致的...

    浅谈java多线程wait,notify

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

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

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

    Java wait和notifyAll实现简单的阻塞队列

    Java wait和notifyAll实现简单的阻塞队列 在 Java 中,wait 和 notifyAll 是两个非常重要的方法,它们都是在 Object 类中声明的,用于实现线程之间的通信和同步。wait 方法会使调用线程进入等待状态,并释放所持有...

    java中几个notify、wait使用实例

    在Java的多线程编程中,`notify()`与`wait()`是实现线程间通信的重要方法,它们主要用于解决生产者消费者问题、读者写者问题等典型同步问题。这两个方法定义在`Object`类中,因此所有Java对象都可以作为锁来使用。在...

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

    本文旨在解析一个具体的Java多线程示例代码,以帮助读者更好地理解`wait()`与`notify()`方法的作用及其实现机制。这两个方法是Java中实现线程间通信的重要手段之一,尤其在解决生产者消费者模型、读者写者问题等经典...

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

     在 Java 中可以用 wait、notify 和 notifyAll 来实现线程间的通信。。举个例子,如果你的Java程序中有两个线程——即生产者和消费者,那么生产者可以通知消费者,让消费者开始消耗数据,因为队列缓冲区中有内容待...

    等待机制与锁机制wait notify

    `wait()`、`notify()`和`notifyAll()`是Java `Object`类的三个方法,它们用于线程间的通信。这些方法必须在同步环境中(即synchronized方法或synchronized代码块)使用,否则会抛出`IllegalMonitorStateException`...

    Java wait和notify虚假唤醒原理

    Java中的`wait()`和`notify()`是用于多线程同步的关键方法,它们是Object类的成员,因此所有Java对象都可以调用。这两个方法是Java内存模型(JMM)的一部分,用于控制线程间的协作和通信。 `wait()`方法使得当前...

Global site tag (gtag.js) - Google Analytics