闲来无事,在逛论坛时偶然看到这样一道题:
子线程循环十次,接着主线程循环一百次,接着又回到子线程循环十次,然后主线程再循环一百次,如此循环往复,循环五十次。
尝试着做了一下,首先定义了一个内部类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(); } } }
输出的结果如下
结果满足了题目要求,或许也有更好的方法,欢迎大家尝试。
时间: 2024-09-25 07:40:43