精华内容
下载资源
问答
  • notify notifyAll wait

    2015-08-25 18:32:57
     * notify notifyAll wait 使用   * 1 一个对象执行相应的方法  * (一个对象wait后,需要调用同一个对象的notify唤醒这个对象的wait,可以在不同线程执行)  * 2 个人理解方法执行必须在synchronize代码块...

     

     * notify notifyAll wait 使用 

     * 1 一个对象执行相应的方法

     *  (一个对象wait后,需要调用同一个对象的notify唤醒这个对象的wait,可以在不同线程执行)

     * 2 个人理解方法执行必须在synchronize代码块中执行(因为方法执行的时候必须获得对象监视器,个人理解监视器就是锁)

     * 3 执行wait后当前线程会释放掉这个对象的锁,则其他线程就会获得这个对象锁(其他线程就能执行synchronize代码块中代码)

     * 

     * 场景设想: 一个运输公司要运输一批货物

     *         领导告诉所有的搬运工时刻准备着,(主线程创建N个线程待用,所有线程处于等待转改)

     *         一旦运输货物到了, (资源转备好后)

     *         马上开始执行搬运工作 (主线程调用notifyAll,唤醒所有子线程开始执行 )

     

    public class TestNotify implements Runnable{
    
    	private  Integer counter=0; 
    	private String waitObj ; 
    	
    	public TestNotify(String wait,int counter2 ) {
    		this.waitObj=wait ; 
    		this.counter = counter2 ; 
    	}
    
    	public static void main(String[] args) {
    		String wait1 = "" ; 
    		
    		for(int i=0;i<3;i++){
    			TestNotify d = new TestNotify(wait1,i);
    			new Thread(d).start(); 
    		}
    		
    		try {
    			Thread.sleep(10000);
    			System.out.println( " 主线程结束 ");
    			synchronized (wait1) {
    				wait1.notifyAll();
    			}
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    	}
    
    	@Override
    	public void run() {
    		 synchronized (waitObj) {
    			try {
    				System.out.println("子线程启动=="+counter);
    				Thread.sleep(2000);
    				waitObj.wait();
    				
    				System.out.println("子线程结束"+counter);
    			} catch ( Exception e) {
    				e.printStackTrace();
    			}
    		}
    	}
    	
    }
    

     

    结果分析:子线程 0,1,2都计入wait后主线程调用notifyAll,则子线程开始执行wait后面代码;

     

    子线程启动==0
    子线程启动==2
    子线程启动==1
     主线程结束 
    子线程结束1
    子线程结束2
    子线程结束0

     

     

    展开全文
  • sleep:调用sleep使任务进入休眠状态,任务在指定的时间内不会运行,锁没有被释放。 yield:此刻让出cpu,所有线程再次竞争cpu使用权,锁未被释放 ...wait:使线程挂起,知道线程得到了notify或noti...

    sleep:调用sleep使任务进入休眠状态,任务在指定的时间内不会运行,锁没有被释放。

    yield:此刻让出cpu,所有线程再次竞争cpu使用权,锁未被释放

    如果Thread1和Thread2都使用synchronized (object),Thread1调用yield,Thread2也不会被执行,要等object锁被释放才可以。

    wait:使线程挂起,知道线程得到了notify或notifyAll消息,线程才会进入就绪状态,锁被释放。

    notify:唤醒一个正在wait当前对象锁的线程,并让它拿到对象锁
    notifyAll:唤醒所有正在wait前对象锁的线程,所有的线程只是跳出了wait状态,接下来它们还会是竞争对象锁

    展开全文
  • // object类的notify(),notifyall(),wait,wait(long),wait(long,int) // object.wait(); 使拥有当前对象object的线程进入睡眠状态,放弃锁release lock; // notify() 通知在对象上因调用wait()而处于睡眠...

    //			object类的notify(),notifyall(),wait,wait(long),wait(long,int)
    //			object.wait();  使拥有当前对象object的线程进入睡眠状态,放弃锁release lock;
    //			notify() 通知在对象上因调用wait()而处于睡眠状态的某一线程启动;
    //			notifyAll() 通知在对象上因调用wait()而处于睡眠状态的所有线程启动,这些进程根据优先级顺序执行;
    
    class Q {
    	int n;
    	boolean valueSet = false;
    
    	public synchronized int get() {
    		if (!valueSet)
    			try {
    				this.wait(); // 使当前使用该对象的线程睡眠
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		System.out.println("Get n = " + n);
    		valueSet = false;
    		notify(); // 通知一个线程可以调用该线程了
    		return n;
    	}
    
    	public synchronized void put(int n) {
    		// if valueSet == true,already have value so wait fetch,else put
    		if (valueSet)
    			try {
    				this.wait();
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		this.n = n;
    		System.out.println("Put n = " + n);
    		valueSet = true;
    		notify();
    	}
    }
    
    class Producer implements Runnable {
    	Q q = null;
    
    	Producer(Q q) {
    		this.q = q;
    		(new Thread(this, "Producer")).start();
    	}
    
    	@Override
    	public void run() {
    		int i = 0;
    		while (i < 10) {
    			q.put(i++);
    		}
    	}
    }
    
    class Consumer implements Runnable {
    	Q q = null;
    
    	public Consumer(Q q) {
    		this.q = q;
    		(new Thread(this, "Consumer")).start();
    	}
    
    	@Override
    	public void run() {
    		while (q.get() < 9) {
    		}
    	}
    }
    
    public class DemoThread {
    	public static void main(String[] args) {
    		Q q = new Q();
    
    		new Consumer(q);
    		new Producer(q);
    	}
    }
     
    展开全文
  • 背景: 在编写生产者 / 消费者代码时, 遇到了一些奇怪的现象, 例如超额生产 / 超额消费, 而这些的原因是由于我们对 wait notify notifyAll 的理解不正确 下面有一些多线程下使用 wait notify notifyAll 注意事项 ...

    背景: 在编写生产者 / 消费者代码时, 遇到了一些奇怪的现象, 例如超额生产 / 超额消费, 而这些的原因是由于我们对 wait notify notifyAll 的理解不正确

    下面有一些多线程下使用 wait notify notifyAll 注意事项

    • wait notify notifyAll 都要放在 synchronized 方法 / 代码块中, 否则运行异常 java.lang.IllegalMonitorStateException
    • 务必在 while 而不是 if 中使用 wait (). 因为当 wait () 被唤醒后, 此时条件可能已经改变, 是需要应该再次校验是否满足条件, 而不是直接往下运行代码. 索引使用 while 而不是 if
    • 使用 notifyAll () 而不是 notify (). notify () 表示通知某一个线程, 而 notifyAll () b 表示通知所有等待此锁的线程. 因为在多线程下, 如果仅仅使用 notify () 来通知其他线程, 可能会通知到相同类型的线程, 例如消费者线程通知到其他消费者线程, 这会导致生产者线程无法被通知到, 一直处于 wait () 的状态
    展开全文
  • wait notify notifyAll

    2016-06-28 22:16:00
    而另一个线程B调用了该对象的notify或者notifyAll方法,线程A收到通知后从对象的wait方法返回,进而执行后续操作,上述两个线程通过对象来完成交互,而对象上的waitnotify/notifyAll的关系就如同开关信号一样,...
  • wait notify notifyall

    2015-10-09 18:37:27
    resource.wait()使线程释放锁并进入wait状态(等待resource.notify() 或 resource.notifyAll(), 不是等待获得resource的锁). resource.notify()会唤醒一个在resource.wait状态的线程(具体哪个由操作系统调度),使那个...
  • Java多线程之wait notify notifyAll
  • JAVA线程 -- wait notify notifyAll
  • java wait notify notifyall

    2017-02-25 17:18:50
    等待池---------------------wait(),notify(),notifyAll()  如果一个线程调用了某个对象的wait方法,那么该线程进入到该对象的等待池中(并且已经将锁释放),  如果未来的某一时刻,另外一个线程调用了相同对象的...
  • notifyallnotify 一般被放在 syn代码块的最后 1.线程休眠sleep();:线程有优先级,但是我们可以用此方法人为的改变它们的优先级,让线程暂停,它其他线程获得分配空间。 用法:Thread.sleep(2000);//休眠两秒 ...
  • wait notify notifyAll理解

    2019-06-17 09:42:00
    2019独角兽企业重金招聘Python工程师标准>>> ...
  • wait 方法是使拥有当前对象(object)的线程(thread)放弃锁(release lock),进入睡眠状态notify 通知该对象(object)因上面调用wait而等待的某一进程重新唤醒启动notifyAll 通知在对象(object)上因调用wait而等待...
  • 在多线程的情况下,由于同一进程的多个线程共享同一片存储空间,在... waitnotify是java同步机制中重要的组成部分。结合与synchronized关键字使用,可以建立很多优秀的同步模型。  synchronized(this){ }等价于pub
  • Java 多线程学习笔记 线程通讯 wait notify notifyAll的理解 wait()、 notify()、 notifyAll()是Object类的实例方法,是多线程之间通信的手段 2. wait():当某个条件无法满足,当前线程又没有能力解决时,等待直到...
  • wait notify notifyAll 都是Object类的方法  wait notify notifyAll都是对实例的wait set 进行操作 所以他们是Object的方法比较合适  另外 注意有synchronized修饰的方法 当线程A对实例obj进行操作时 会加锁 别...
  • 文章目录Object类的wait notify notifyAll常见面试问题 Object类的wait notify notifyAll常见面试问题 手写生产者消费者设计模式 . 如下的连接中已有代码实现 ...代码多敲几遍, 再手写, 也可以在面试中, 被问到熟悉...
  • waitnotify 1.wait 会阻塞当前进程,然后释放锁 2. notify会唤醒阻塞的进程,但是并不释放当前锁 3. waitnotify的调用需要是线程获取该监视器对象,才能调用,否则会报异常:IllegalMonitorStateException. ...
  • Java - sleep yield wait notify notifyAll join 方法功能解析。方法的区别分析。线程几种状态分析。
  • Object wait notify notifyAll 方法详解

    千次阅读 2018-11-01 14:52:49
    notify()方法表示,当前的线程已经放弃对资源的占有, 通知等待的线程来获得对资源的占有权,但是只有一个线程能够从wait状态中恢复, 然后继续运行wait()后面的语句; notifyAll()方法表示,当前的线程已经放弃对...
  • thread的wait notifyAll notify 只能在同步代码中调用。 wait 释放当前的锁,并进入等待状态,如果没有别的线程调用notifyall 或者notify() 则会一直处于等待状态: public class SynDemo { private Object lock; ...
  • 源码—Java多线程5—死锁和wait notify notifyAll
  • 多线程的wait notify notifyall sleep stop interrupt join wait notify wait notify 都是object根类上的方法(貌似现在不太常用) wait调用之前 wait方法调用之前要先获得该对象的监视器锁,否则会报...
  • 文章目录wait notify notifyAll的特点 性质wait 的原理线程状态转换的特殊情况 wait notify notifyAll的特点 性质 执行wait notify notifyAll 之前, 必须首先获取到 monitor 否则抛出异常 notify 只能唤醒其中一个...
  • 参考 如何在 Java 中正确使用 wait, notifynotifyAll – 以生产者消费者模型为例

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,024
精华内容 2,809
关键字:

notifynotifyallwait