闲来无事,在逛论坛时偶然看到这样一道题:
子线程循环十次,接着主线程循环一百次,接着又回到子线程循环十次,然后主线程再循环一百次,如此循环往复,循环五十次。
尝试着做了一下,首先定义了一个内部类Circle,类中有两个方法分别演示子线和主线的循环,main方法和sub方法,并给这两个方法加锁,用synchronized修饰方法。接着在主函数中定义了一个多线程方法,用来输出五十次的子线程循环,在方法内进行了五十次的主线程循环。此时可以输出五十次的主线和子线了,但是顺序乱了,并不能按题目要求的那样先子线循环十次接着主线循环一百次,解决办法是定义一个nowSub的布尔方法,每次执行前先判断,符合时执行,不符合时等待,执行结束后用notify唤起等待线程。
实现代码如下:
public class Communication {
public static void main(String[] args) {
final Circle circle=new Circle();
new Thread(new Runnable(){
@Override
public void run() {
for(int i=1;i<=50;i++){
circle.sub(i);
}
}
}).start();
for(int i=1;i<=50;i++){
circle.main(i);
}
}
static class Circle{
private boolean nowSub=true;
public synchronized void sub(int i){
if(!nowSub){
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for(int j=1;j<=10;j++){
System.out.println("子线循环"+j);
}
nowSub=false;
notify();
}
public synchronized void main(int i){
if(nowSub){
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for(int j=1;j<=100;j++){
System.out.println("主线循环"+j+"**********总循环:"+i);
}
nowSub=true;
notify();
}
}
}
输出的结果如下
结果满足了题目要求,或许也有更好的方法,欢迎大家尝试。