首页 > 代码库 > 线程同步通信技术(三)
线程同步通信技术(三)
一. 线程通信:
在同步方法中,线程之间的通信主要依靠以下三个方法来实现:
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. 要用的公共数据的若干方法写在一个类中,这种设计体现了高类聚和程序的健壮性。
线程同步通信技术(三)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。