java notify()不是只能唤醒单个线程么,为什么我程序的notify()能唤醒3个

问题描述

java notify()不是只能唤醒单个线程么,为什么我程序的notify()能唤醒3个

程序是这样的

/*   第一个类*/
 public class ThreadB extends Thread{
    int total;
    public void run(){
        synchronized(this){
            for(int i=0;i<101;i++){
                total+=i;
            }
            try {
                sleep(100);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            notify();
        }
    }
    public int getTotal(){
        return this.total;
    }

}

/*   第二个类*/
public class ReaderResult extends Thread{
    ThreadB c;
    public ReaderResult(ThreadB c){
        this.c=c;
    }
    public void run(){
        synchronized (c) {
            try{
                System.out.println(Thread.currentThread()+"等待计算结果。。。。");
                c.wait();
            }catch(InterruptedException e){
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread()+"计算结果为:"+c.getTotal());
        }
    }
    public static void main(String[] args) {
        ThreadB calculator = new ThreadB();

        ReaderResult reader1=new ReaderResult(calculator);
        ReaderResult reader2=new ReaderResult(calculator);
        ReaderResult reader3=new ReaderResult(calculator);
        reader1.start();
        reader2.start();
        reader3.start();
        calculator.start();

    }
}

输出结果大多数都
Thread[Thread-1,5,main]等待计算结果。。。。
Thread[Thread-3,5,main]等待计算结果。。。。
Thread[Thread-2,5,main]等待计算结果。。。。
Thread[Thread-1,5,main]计算结果为:5050
Thread[Thread-2,5,main]计算结果为:5050
Thread[Thread-3,5,main]计算结果为:5050

理论上不是只能唤醒一个吗?

解决方案

参考:http://www.iteye.com/problems/89570

解决方案二:

notify是只能唤醒一个线程没错,但是你应该看清楚解释,当线程被wait时要有个对象,或者锁去调用这个方法,同理notify时,也是这样。而且notify的调用对象是调用wait方法时的对象,它会从等待队列中将其唤醒。你注意代码,你三个线程调用wait方法的对象是同一个对象,那么应该会导致一次notify唤醒三个。

时间: 2024-09-11 17:11:56

java notify()不是只能唤醒单个线程么,为什么我程序的notify()能唤醒3个的相关文章

Java多线程:“基础篇”05之线程等待与唤醒

wait(), notify(), notifyAll()等方法介绍 在Object.java中,定义了wait(), notify()和notifyAll()等接口.wait()的作用是让当前线程进入 等待状态,同时,wait()也会让当前线程释放它所持有的锁.而notify()和notifyAll()的作用,则是唤 醒当前对象上的等待线程:notify()是唤醒单个线程,而notifyAll()是唤醒所有的线程. Object类中关于等待/唤醒的API详细信息如下: notify()    

java同步关键词解释、synchronized、线程锁(Lock)

1.java同步关键词解释 21.1 synchronized synchronized是用来实现线程同步的!!!                      加同步格式:                    synchronized( 需要一个任意的对象(锁) ){                             代码块中放操作共享数据的代码.                    }          见代码MySynchronized package thread1;   publ

详解Java多线程编程中LockSupport类的线程阻塞用法_java

LockSupport是用来创建锁和其他同步类的基本线程阻塞原语. LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程,而且park()和unpark()不会遇到"Thread.suspend 和 Thread.resume所可能引发的死锁"问题. 因为park() 和 unpark()有许可的存在:调用 park() 的线程和另一个试图将其 unpark() 的线程之间的竞争将保持活性. 基本用法LockSupport 很类似于二元信号量

多线程下如何唤醒指定线程

问题描述 看了一下午还没弄明白,java里如何唤醒指定线程以下是我编的例子,希望实现在主函数里挂起,唤醒Thread1或者Thread2.暂时不考虑使用while(boolean){wait()}的方法线程代码如下packagecom.JW;classChildThreadimplementsRunnable{Stringm_strThreadName;longm_nTime;ThreadMyThread;ChildThread(StringThreadName,longTime){this.m

java使用Executor(执行器)管理线程

v一.一个实现了Runnable接口的类 class MyThread implements Runnable{ private static int num = 0; @Override public void run() { while(true){ synchronized(MyThread.class){ ++num; try{ Thread.sleep(500); } catch(Exception e){ System.out.println(e.toString()); } Sys

java的ThreadLocal是否能被其他线程访问到?里面的机制是怎么样的

问题描述 java的ThreadLocal是否能被其他线程访问到?里面的机制是怎么样的 解决方案 threadlocal是针对 per-thread的,不会被其他线程并发访问.threadlocal变量和单个线程关联,简单来讲,类似于(具体可参考jdk源码):public class FakeThreadLocal<T> { private final Map<Thread, T> values = new HashMap<Thread, T>(); public T

如何唤醒指定线程

问题描述 看了一下午还没弄明白,java里如何唤醒指定线程以下是我编的例子,希望实现在主函数里挂起,唤醒Thread1或者Thread2.暂时不考虑使用while(boolean){wait()}的方法线程代码如下packagecom.JW;classChildThreadimplementsRunnable{Stringm_strThreadName;longm_nTime;ThreadMyThread;ChildThread(StringThreadName,longTime){this.m

Java使用synchronized修饰方法来同步线程的实例演示_java

Java中可以使用关键字synchronized进行线程同步控制,实现关键资源顺序访问,避免由于多线程并发执行导致的数据不一致性等问题.synchronized的原理是对象监视器(锁),只有获取到监视器的线程才能继续执行,否则线程会等待获取监视器.Java中每个对象或者类都有一把锁与之相关联,对于对象来说,监视的是这个对象的实例变量,对于类来说,监视的是类变量(一个类本身是类Class的对象,所以与类关联的锁也是对象锁).synchronized关键字使用方式有两种:synchronized方法

java web应用中新起一个线程 在线程中怎么获取系统登录的数据

问题描述 java web应用中新起一个线程 在线程中怎么获取系统登录的数据 java web应用中新起一个线程 在线程中怎么获取系统登录的数据,系统登录用的是Spring Secrity 解决方案 可以使用缓存,自己写一个缓存类.或者使用Redis.