java多线程之wait()/notify/notifyAll()

wait / notify / noitfyAll

  • 作用于同一个对象
  • 官方解释
  • 例子
  • 注意:
    • wait /notify不管是哪个/哪些线程,只要保证是同一个对象就可以。
    • 调用wait和notify/notifyAll的地方要加上synchronized关键字,不然会报错!参考:[https://www.cnblogs.com/szrs/p/11867805.html](https://www.cnblogs.com/szrs/p/11867805.html)
    • 更加完善/复杂的线程交互(wait/notify),可参考《how tomcat works》第四章源码

今天发现点java多线程关于wait()/notify/notifyAll()方法的小细节,特此记录以便后面查阅。

作用于同一个对象

wait(): 迫使当前线程等待。
notify()/notifyAll():唤醒在当前对象(this)上正在等待的线程。

wait —notify/notifyAll : 就是两个相反的动作,就像 “停止—启动”一样,并且,这两个相反的动作是针对同一个对象的。 比如,将A汽车停止,自然启动也要针对A汽车来启动,而不是B汽车、C汽车。

官方解释

官方文档也已经说明,“针对同一对象”
java多线程之wait()/notify/notifyAll()_第1张图片
java多线程之wait()/notify/notifyAll()_第2张图片

例子

创建 Road类实现Runnable接口

package com.xl.threadinteraction;

public class Road implements Runnable {
	
	private Car car;
	
	
	@Override
	public void run() {
		Car car = this.getCar();
		car.receiveNotify();
	}
	
	
	void startThead() {
		Thread thread002 = new Thread(null,this,"thread002");
		thread002.start();
	}
	

	public Car getCar() {
		return car;
	}


	public void setCar(Car car) {
		this.car = car;
	}
	

}

创建Car类实现Runnable接口

package com.xl.threadinteraction;

public class Car implements Runnable {
	
	private String color;
	
	private String year;
	
	
	public Car () {
	}
	
	public Car (String year, String color) {
		this.year = year;
		this.color = color;
	}
	

	@Override
	public void run() {
		drive();
		System.out.println("car driving....");
	}

	
	synchronized void drive() {
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
	}
	
	synchronized void receiveNotify() {
		notifyAll();
	}
	
	/**
	 * 
	 * @Description getters and setters
	 * @return
	 * @author John Abruzzi
	 * @date   2021年12月3日
	 */
	public String getColor() {
		return color;
	}

	public void setColor(String color) {
		this.color = color;
	}

	public String getYear() {
		return year;
	}

	public void setYear(String year) {
		this.year = year;
	}
}

创建启动类

package com.xl.threadinteraction;

public class ThreadInteraction {

	public static void main(String[] args) {
		// 创建car对象
		Car car001 = new Car("1982","red");
//		Car car002 = new Car("1900","black");
		
		// 创建线程
		Thread thread001 = new Thread(null,car001,"thread001");
		thread001.start();
//		Thread thread002 = new Thread(null,car002,"thread001");
//		thread002.start();
		
		// 创建road对象
		Road road001 = new Road();
		road001.setCar(car001);
		road001.startThead();
		
	}

}

因为无论是wait()方法,还是notifyAll()方法都是在名为“car001”这个对象上进行调用的,所以是同一个对象,执行结果会打印 “car driving…”
java多线程之wait()/notify/notifyAll()_第3张图片
java多线程之wait()/notify/notifyAll()_第4张图片
假设将启动类中传不同的对象,即是:在car001上调用wait(), 在car002上调用notifyAll, 则执行结果不会有输出。
java多线程之wait()/notify/notifyAll()_第5张图片
java多线程之wait()/notify/notifyAll()_第6张图片

注意:

wait /notify不管是哪个/哪些线程,只要保证是同一个对象就可以。

java多线程之wait()/notify/notifyAll()_第7张图片

调用wait和notify/notifyAll的地方要加上synchronized关键字,不然会报错!参考:https://www.cnblogs.com/szrs/p/11867805.html

更加完善/复杂的线程交互(wait/notify),可参考《how tomcat works》第四章源码

你可能感兴趣的:(java,java,多线程,wait/notify)