再次学习,学会了多线程间通信的分析思路。希望对你有用。
public class ThreadTi {
//要求:子线程循环10次,父线程循环50次,子线程循环10次,父线程循环50次,如此循环100次
// 要注意:分析的思路,哪些循环是不可以打断的,就使用synchronized
public static void main(String[] args) {
Dem d = new Dem();
new Thread(new Runnable() {
@Override
public void run() {
for(int i = 1; i <= 100; i++){
d.showChild(i);
}
}
}).start();
new Thread(){
public void run() {
for(int i = 1; i <= 100; i++){
d.showParent(i);
}
};
}.start();
}
}
class Dem {
public boolean isChild = true;
// synchronized修饰方法时,以当前对象this为 “锁”
public synchronized void showChild(int j){
//判断是否该子线程执行
while(!isChild){
try {
this.wait();
// 这里要注意的是:wait必须写在synchronized代码块中,不然会出现异常
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 这里写while和if,运行时没有什么区别的。
// 但是根据API文档知道,线程可能会被虚假唤醒,并不满足条件执行条件,
// 使用if的话就会直接跳出if语句,执行下面的代码。
// 所以使用while的话,会程序更加安全。
for(int i = 1; i <= 10; i++){
System.out.println("Child thread of "+i+", loop of "+j);
}
//更改信息
isChild = false;
//唤醒等待的父线程
this.notify();
}
public synchronized void showParent(int j){
//判断是否该父线程执行
while(isChild){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i = 1; i <= 50; i++){
System.out.println("Father thread of "+i+", loop of "+j);
}
//修改信息
isChild = true;
//唤醒子线程
this.notify();
}
}