线程同步通信技术(三)

一. 线程通信:

在同步方法中,线程之间的通信主要依靠以下三个方法来实现:

1. wait() 调用该方法会使当前线程暂停执行并释放对象锁,让其他线程可以进入Synchronized代码块,当前线程放入对象等待池中。

2. notify() 调用该方法会从对象等待池中移走任意一个线程

3. notifyAll() 调用该方法会从对象等待池中移走所有等待的线程。


二. 一道面试题:

子线程循环10次,接着主线程循环100次, 接着又回到子线程循环10次,接着再回到主线程循环100次,如此循环50次,代码如下:

public class TraditionalThreadCommunication {
	public static void main(String[] args) {
		final Business business = new Business();
		new Thread(new Runnable() {
			@Override
			public void run() {
				for (int i = 1; i <= 50; i++) {
					business.sub(i); // 调用子线程
				}
			}
		}).start();

		for (int i = 1; i <= 50; i++) {
			business.main(i); // 调用主线程
		}
	}
}

class Business {
	private boolean shouldSubRun = true;   

	public synchronized void sub(int i) {
		while (!shouldSubRun) {
			try {
				// 没轮到自己就等一会
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		for (int j = 1; j <= 10; j++) {
			System.out.println("sub thread sequence of  " + j + " , loop of  " + i);
		}
		shouldSubRun = false;
		// 唤醒下一个等待的线程
		this.notify();
	}

	public synchronized void main(int i) {
		while (shouldSubRun) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		for (int j = 1; j <= 100; j++) {
			System.out.println("main thread sequence of  " + j + " , loop of  " + i);
		}
		shouldSubRun = true;
		this.notify();
	}
}
注意点:

1. 使用while循环可以防止线程自己唤醒自己,即“伪唤醒”。

2. 要用的公共数据的若干方法写在一个类中,这种设计体现了高类聚和程序的健壮性。


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。