两个线程间的通信

两个线程间的通信

  • 1.什么时候需要通信
    • 多个线程并发执行时,在默认情况下CPU是随机切换线程的。
    • 如果我们希望他们有规律的执行,就可以使用通信,例如每个线程执行一次打印。
  • 2.怎么通信
    • 如果希望线程等待,就调用wait()
    • 如果希望唤醒等待的线程,就调用notify()
    • 这两个方法必须在同步代码中执行,并且使用同步锁对象来调用
package com.heima.thread2;

public class Demo01_Notify {

	/**
	 * @param args
	 * 等待唤醒机制
	 */
	public static void main(String[] args) {
		final Printer p = new Printer();
		
		new Thread() {
			public void run() {
				while(true) {
					try {
						p.print1();
					} catch (InterruptedException e) {
						
						e.printStackTrace();
					}
				}
			}
		}.start();
		
		new Thread() {
			public void run() {
				while(true) {
					try {
						p.print2();
					} catch (InterruptedException e) {
						
						e.printStackTrace();
					}
				}
			}
		}.start();
	}

}

//等待唤醒机制
class Printer {
	private int flag = 1;
	public void print1() throws InterruptedException {							
		synchronized(this) {
			if(flag != 1) {
				this.wait();					//当前线程等待
			}
			System.out.print("黑");
			System.out.print("马");
			System.out.print("程");
			System.out.print("序");
			System.out.print("员");
			System.out.print("\r\n");
			flag = 2;
			this.notify();						//随机唤醒单个等待的线程
		}
	}
	
	public void print2() throws InterruptedException {
		synchronized(this) {
			if(flag != 2) {
				this.wait();
			}
			System.out.print("传");
			System.out.print("智");
			System.out.print("播");
			System.out.print("客");
			System.out.print("\r\n");
			flag = 1;
			this.notify();
		}
	}
}
发布了347 篇原创文章 · 获赞 11 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/LeoZuosj/article/details/104215985