Java线程——线程习题(一)子线程执行10次后,主线程再运行5次,这样交替执行三遍

题目:子线程执行10次后,主线程再运行5次,这样交替执行三遍

代码如下:

package com.itheima.gan;
/**
 *  子线程执行10次后,主线程再运行5次,这样交替执行三遍
 * @author 12428
 *
 */
public class Test {
    public static void main(String[] args) {
        final Bussiness bussiness=new Bussiness();
        //创建一个子线程,run方法里面子线程执行3变
        new Thread(new Runnable() {
            public void run() {
                for(int i=0;i<3;i++) {
                    bussiness.subMethod();
                }
            }
        }).start();
        
        //主线程
        for(int i=0;i<3;i++) {
            bussiness.mainMethod();
        }
    }
    
}

class Bussiness{
    //创建一个私有的标识位
    private boolean subFlag=true;
    
    public synchronized void mainMethod() {
        
        while(subFlag) {
            try {
                //标识为true 就等待,释放所持有的锁,让另一个线程执行,直到被唤醒才继续执行下去
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        
        //如果当前的标志位不为true
        //就向下执行
        for(int i=0;i<5;i++) {
            System.out.println(Thread.currentThread().getName()+" : main thread running loop count --"+i);
            try {
                //线程休眠1s,再执行
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
        //执行完上面的循环后再把标志位改为true,防止这个线程两次连续执行
        subFlag=true;
        notify();
    }


    public synchronized void subMethod() {
        //如果标识位为false
        //就执行等待,让另一个线程执行,直到被唤醒
        while(!subFlag) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        
        //如果标识为true
        //向下执行
        for(int i=0;i<10;i++) {
            System.out.println(Thread .currentThread().getName()+" : sub thread runnig loop count -- "+i);
            //每执行一次就休眠1s
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        
        //执行完一个循环后就将标识为改为false,防止这个线程连续两次执行
        subFlag=false;
        notify();
        
    }
    
}

 

  运行结果:

     

   

 

  

 

posted @ 2019-12-02 15:41  颗就完了  阅读(595)  评论(0编辑  收藏  举报