线程同步通信技术(三)
一. 线程通信:
在同步方法中,线程之间的通信主要依靠以下三个方法来实现:
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. 要用的公共数据的若干方法写在一个类中,这种设计体现了高类聚和程序的健壮性。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。