编程题1

多线程相关的编程题

题目:子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,
    接着又回到主线程循环100次,如此反复50次,请写出程序。


//经验:要用到共同数据(包括同步锁)的若干方法应该归在同一个类身上,
//    这种设计设计正好体现了高聚合和程序程序的健壮性。
//子线程和主线程切换需要引入flag变量,如果cpu执行权先交给了主线程,则需要让
//  主线程进行等待,这时候就可以让子线程执行,执行后唤醒主线程。
//在判断标记的时候,用while更好,因为线程有时候会在没有被通知的情况下唤醒,称为伪唤醒
//    这时候,用while进行重复检测是最好的。


public class Test1 {
    public static void main(String[] args){
        final Business business=new Business();
        new Thread(
                new Runnable() {
                    @Override
                    public void run() {
                         for (int i=1;i<=50;i++){
                            business.sub(i);
                        }
                    }
                }
        ).start();
        for (int i=1;i<=50;i++){
                business.main(i);
        }
    }
}
    class Business{
        private boolean flag=true;
        public synchronized void sub(int i){
            while (!flag) {
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                for (int j = 1; j <= 10; j++) {
                    System.out.println("sub thread sequece of " + j + " loop of    " + i);
                }
            }
            flag=false;
            this.notify();
        }
        public synchronized void main(int i){
            while(flag) {
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                for (int j = 1; j <= 100; j++) {
                    System.out.println("main thread sequece of " + j + " loop of " + i);
                }
            }
            flag=true;
            this.notify();
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值