关于notifyAll()问题

问题描述

不是说notifyAll()是让所有挂起线程恢复的吗?下面代码怎么只恢复了其中t51的线程。。。class A5 implements Runnable{ int i=0; String name; public void run() { while(true) { i++; System.out.println(name+"Z="+i); if(i==5){ try{ 挂起线程A5();} catch(Exception e){} } try{ Thread.sleep(1000);} catch(Exception e){} } } public synchronized void 挂起线程A5() throws InterruptedException { wait(); } public synchronized void 恢复线程A5() { notifyAll(); }}public class Example15{ public static void main(String args[]) { int m=0; A5 t51=new A5(); //线程A5的目标对象 t51.name="张一"; Thread thread=new Thread(t51); thread.setName(t51.name); A5 t52=new A5(); //线程A5的目标对象 t52.name="张二"; Thread thre=new Thread(t52); thre.setName(t52.name); thre.start(); thread.start(); while(true) { m++; System.out.println("我是主线程m="+m); if(m==10) { System.out.println("让全部线程继续工作"); try { t51.恢复线程A5(); } catch(Exception e){} break; } try{ Thread.sleep(1000); } catch(Exception e){} } }}

解决方案

public class Example15 {public static void main(String args[]) {int m=0; Object oo = new Object();A5 t51=new A5(); //线程A5的目标对象 t51.name="张一"; t51.synchronizedObject = oo;Thread thread=new Thread(t51); //thread.setName(t51.name);A5 t52=new A5(); //线程A5的目标对象 t52.name="张二"; t52.synchronizedObject = oo;Thread thre=new Thread(t52); //thre.setName(t52.name);thre.start();thread.start(); while(true) {m++;System.out.println("我是主线程m="+m); if(m==10) {System.out.println("让全部线程继续工作"); try {t51.恢复线程A5();} catch(Exception e){} break;}try {Thread.sleep(1000);} catch(Exception e){} }} } class A5 implements Runnable {Object synchronizedObject;int i=0;String name; public void run() {while(true) {i++;if(i==5) {System.out.println(name+" 挂起."); try{挂起线程A5();} catch(Exception e){} } else {System.out.println(name+"Z="+i); }try{Thread.sleep(1000);} catch(Exception e){}if(i==15) {System.out.println(name+" 完成."); break;}}}public void 挂起线程A5() throws InterruptedException { synchronizedObject.wait();}public void 恢复线程A5() {synchronizedObject.notifyAll(); }} 1,多线程中常见的问题:wait、notify、notifyAll必须针对同一个同步对象,不显式指定同步对象,同步对象为This,t51的this和t52的this当然不同。2,我直接传入的一个相同的同步对象给两个线程,就好了。
解决方案二:
结果:引用张二Z=1我是主线程m=1张一Z=1张一Z=2我是主线程m=2张二Z=2张二Z=3我是主线程m=3张一Z=3张二Z=4张一Z=4我是主线程m=4张一 挂起.我是主线程m=5张二 挂起.我是主线程m=6张二Z=6张一Z=6张二Z=7张一Z=7我是主线程m=7张二Z=8我是主线程m=8张一Z=8张二Z=9张一Z=9我是主线程m=9我是主线程m=10让全部线程继续工作张一Z=10张二Z=10张一Z=11张二Z=11张一Z=12张二Z=12张一Z=13张二Z=13张一Z=14张二Z=14张一Z=15张二Z=15张一 完成.张二 完成.

时间: 2024-10-25 19:26:19

关于notifyAll()问题的相关文章

Java notify和notifyAll的区别和相同_java

经常在往上逛,关于在java中notify和notifyAll,经常有人有以下的说法: notify只会通知一个在等待的对象,而notifyAll会通知所有在等待的对象,并且所有对象都会继续运行 并且,好像都有例子可以证明.上面的说法,可以说对,也可以说不对.究其原因,在于其中有一点很关键,官方的说法如下所示: wait,notify,notifyAll: 此方法只应由作为此对象监视器的所有者的线程来调用.通过以下三种方法之一,线程可以成为此对象监视器的所有者 : 通过执行此对象的同步实例方法.

Java的wait(), notify()和notifyAll()使用心得(转)

  本篇文章是对java的 wait(),notify(),notifyAll()进行了详细的分析介绍,需要的朋友参考下wait(),notify()和notifyAll()都是java.lang.Object的方法:wait(): Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object.notify()

Java并发(一)wait()与notifyAll()

    当你使用线程来同时执行多个任务时,可以通过使用锁(互斥)来同步两个任务的行为,从而使得一个任务不会干涉另一个任务的资源.也就是说,如果两个任务在交替着使用某项共享资源(通常是内存),你可以使用互斥来是的任何时刻只有一个任务可以访问这项资源.那么,如果线程之间是协作关系,我们必须保证某些步骤在其他步骤之前先被处理.举个例子:必须先挖房子的地基,接下来才能并行的铺设钢结构和构建水泥部件,而这两项任务又必须在浇注混凝土之前完成,等等.     当任务协作时,关键问题是这些任务之间的握手.为了实

Java多线程--同步与死锁:synchronized;等待与唤醒:wait、notify、notifyAll;生命周期

1.问题的引出 class MyThread implements Runnable{ private int ticket = 5 ; // 假设一共有5张票 public void run(){ for(int i=0;i<100;i++){ if(ticket>0){ // 还有票 try{ Thread.sleep(300) ; // 加入延迟 }catch(InterruptedException e){ e.printStackTrace() ; } System.out.prin

如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例

wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视.本文对这些关键字的使用进行了描述. 在 Java 中可以用 wait.notify 和 notifyAll 来实现线程间的通信..举个例子,如果你的Java程序中有两个线程--即生产者和消费者,那么生产者可以通知消费者,让消费者开始消耗数据,因为队列缓冲区中有内容待消费(不为空).相应的,消费者可以通知生产者可以开始生成更多的数据,因为当它消耗掉某些数据后缓冲区不再

线程间协作的两种方式:wait、notify、notifyAll和Condition

在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权.因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去.因此,一般情况下,当队列满时,会让生产者交出对临界资源的占用权,并进入挂起状态.然后等待消费者消费了商品,然后消费者通知生产者队列有空间了.同样地,当

JAVA线程间协作:wait.notify.notifyAll

    JAVA的进程同步是通过synchronized()来实现的,需要说明的是,JAVA的synchronized()方法类似于操作系统概念中的互斥内存块,在JAVA中的Object类型中,都是带有一个内存锁的,在有线程获取该内存锁后,其它线程无法访问该内存,从而实现JAVA中简单的同步.互斥操作.明白这个原理,就能理解为什么synchronized(this)与synchronized(static XXX)的区别了,synchronized就是针对内存区块申请内存锁,this关键字代表类

java-并发-线程间协作的两种方式:wait、notify、notifyAll和Condition

线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权.因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去.因此,一般情况下,当队列满时,会让生产者交出对临界资源的占用权,并进入挂起状态.然后等待消费者消费了商品,然后消费者通知生产者队列有空间了.同样地,当队列空时,消费者也必须等待,等待生产者通知它队列中有

一个关于notify和notifyAll的问题

问题描述 程序不写了,我复述一下吧:程序是要用多线程完成0和1在控制台上的交替输出一个类里,我定义两个方法,一个加一,一个减一.加和减里,我都做了判断,用到了wait()方法和notify:之后定义了两个Thread的继承类,一个run()了加一,一个run()了减一.最后,main方法里,我new了一个含有加一和减一的类,然后start了两个Tread类.结果完成了0和1的替换.但是只要超过了2个线程,结果就会出现问题.原因是加一和减一方法中判断是否wait是用了if,应该改成while:改完

java多线程之wait(),notify(),notifyAll()的详解分析_java

wait(),notify(),notifyAll()不属于Thread类,而是属于Object基础类,也就是说每个对象都有wait(),notify(),notifyAll()的功能.因为每个对象都有锁,锁是每个对象的基础,当然操作锁的方法也是最基础了. wait导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或被其他线程中断.wait只能由持有对像锁的线程来调用. notify唤醒在此对象监视器上等待的单个线程.如果所有线程都在此对象上等