多线程的wait和notify协同工作

以前看过张孝祥老师的视频,讲到一个多线程的例子,是利用wait和notify来实现如下需求,觉得简单又经典,在此缅怀张孝祥老师。
/*
* 子线程先执行10次
* 主线程再执行100次
* 如此循环50次
*/

public class WorkInOrder {
    Business busi = new Business();
    boolean bShouldSub = true;

    public static void main(String[] args) {
        WorkInOrder wio = new WorkInOrder();
        wio.init();
    }

    public void init(){
        new Thread(new Runnable() {
            public void run() {
                for (int i = 0; i < 50; i++) {
                    busi.sub();//子线程执行
                }
            }
        }).start();

        for (int i = 0; i < 50; i++) {
            busi.main();//主线程执行
        }
    }

    class Business{
        public synchronized void sub(){
            while(!bShouldSub){
                try {
                    /*
                     * 该方法只能在同步方法或同步块内部调用。如果当前线程不是对象所得持有者,
                     * 该方法抛出一个java.lang.IllegalMonitorStateException 异常
                     */
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            for (int i = 0; i < 10; i++) {
                System.out.println("********子线程执行次数:"+(i+1));
            }
            bShouldSub = false;
            this.notify();
        }

        public synchronized void main(){
            while(bShouldSub){
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            for (int i = 0; i < 100; i++) {
                System.out.println("========主线程执行次数:"+(i+1));
            }
            bShouldSub = true;
            this.notify();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值