java 多个线程之间的通信

1、使用notifyAll(),唤醒其他所有的等待线程,notify()只能随机唤醒一个等待线程。

2、判断标记的时候注意要使用while,if语句是在哪里等待,就在哪里起来不再执行if里面的判断,而while循环是循环判断,每次都会执行判断标记。

实例;三个线程轮流执行

package com.heima.day25;

public class Demo005 {

	public static void main(String[] args) {
		
		Print2 print = new Print2();
		
		
			new Thread(){
				public void run() {
					for(int i=1;i<=100;i++){
						try {
							print.print1();
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
				};
			}.start();
			
			new Thread(){
				public void run() {
					for(int i=1;i<=100;i++){
						try {
							print.print2();
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
				};
			}.start();
			
			new Thread(){
				public void run() {
					for(int i=1;i<=100;i++){
						try {
							print.print3();
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
				};
			}.start();


	}

}

/*1,在同步代码块中,用哪个对象锁,就用哪个对象调用wait方法
 * 2,为什么wait方法和notify方法定义在Object这类中?
 * 	因为锁对象可以是任意对象,Object是所有的类的基类,所以wait方法和notify方法需要定义在Object这个类中
 * 3,sleep方法和wait方法的区别?
 * a,sleep方法必须传入参数,参数就是时间,时间到了自动醒来
 *   wait方法可以传入参数也可以不传入参数,传入参数就是在参数的时间结束后等待,不传入参数就是直接等待
 * b,sleep方法在同步函数或同步代码块中,不释放锁,睡着了也抱着锁睡
 * 	wait方法在同步函数或者同步代码块中,释放锁
 */ 
class Print2{
	
	private int flag = 1;
	

	Object obj = new Object();
	
	public void print1() throws InterruptedException{
		
		synchronized (obj) {
			/*
			 * 线程1在此等待,if语句是在哪里等待,就在哪里起来
			 * while循环是循环判断,每次都会判断标记
			 */
			while(flag!=1){
				obj.wait();
			}
			
			System.out.print("黑");
			System.out.print("马");
			System.out.print("程");
			System.out.print("序");
			System.out.print("员");
			System.out.print("\r\n");
			
			flag = 2;
			obj.notifyAll();
			System.out.println(Thread.currentThread().getName());
		}
	}
	
	public void print2() throws InterruptedException{
		synchronized (obj) {
			
			while(flag != 2){
				obj.wait();
			}
			System.out.print("传");
			System.out.print("智");
			System.out.print("播");
			System.out.print("客");
			System.out.print("\r\n");
			
			flag = 3;
			obj.notifyAll();
			System.out.println(Thread.currentThread().getName());
		}
	}
	
	public void print3() throws InterruptedException{
		synchronized (obj) {
			
			while(flag != 3){
				obj.wait();
			}
			System.out.print("i");
			System.out.print("t");
			System.out.print("h");
			System.out.print("e");
			System.out.print("i");
			System.out.print("m");
			System.out.print("a");
			System.out.print("\r\n");
			
			flag = 1;
			obj.notifyAll();
			System.out.println(Thread.currentThread().getName());
		}
	}
	
}

猜你喜欢

转载自blog.csdn.net/xldmx/article/details/88952101