感谢张孝祥老师,下面是我看了他的视频之后自己模仿他写出来的代码,以前很多面试题都有这道题,也看了网上的一些答案,那些答案真的很混乱很难看懂,张老师的设计思想把它简单化了,一份优雅的代码让我们很轻松地就理解了,重要的是领教了他的这种设计思想。
package com.thread.test;
/**
* @fileName ConditionCommunication.java
* @description 传统线程同步通信技术,子线程循环10次,接着主线程循环100次,又回到子线程循环10次,接着再回 * 到主线程又循环100次,如此循环50次
*
* @date 2012-2-25
* @time 16:55
* @author wst
*
*/
public class ConditionCommunication {
public static void main(String[] args) {
final Business b=new Business();
new Thread(new Runnable(){
@Override
public void run() {
for(int i=1;i<=50;i++){
b.sub(i);
}
}
}).start();
//因为mian方法本身就占用一个线程,所以主线程不需要再newThread
for(int i=1;i<=50;i++){
b.main(i);
}
}
static class Business{
private boolean b=true;
//子线程循环10次,休息,唤醒下一个线程
public synchronized void sub(int i){
while(!b){
try {
this.wait();//是当前线程休息
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int j=1;j<=10;j++){
System.out.println("j:"+j+" i:"+i);
}
b=false;
this.notify();//唤醒下一个线程
}
//主线程循环100次,休息,唤醒下一个线程
public synchronized void main(int i){
while(b){
try {
this.wait();//是当前线程休息
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int j=1;j<=100;j++){
System.out.println("j:"+j+" i:"+i);
}
b=true;
this.notify();//唤醒下一个线程
}
}
}