synchornized同步锁实现3个线程循环打印数字

线程状态转化图:

在这里插入图片描述

题目

synchornized同步锁实现3个线程循环打印数字,
    使用线程1,打印1,2,3,4,5.
    线程2,打印6,7,8,9,10.
    线程3,打印11,12,13,14,15.
    依次循环打印,直到打印至60

	
package thread;


public class Synchronized_Print {
    //static  共用
	public static int num = 1;//要打印的数字
    public static int index = 0 ; //线程的计数器,用于判断当前线程是否为期望线程
    
    //肯定需要是同步的方法
    public synchronized static void print(){
        //需要判断当前线程是否是期望的线程
        int name = Integer.parseInt(Thread.currentThread().getName());//字符串转int
        while((index%3) != name){//不一样,需要将当前线程阻塞
        //if只做一次判断,如果 判断完 (即还没有调wait时)发生线程的上下文切换(又修改了index)则发生问题(切换回来时,不判断,直接进) ,
        //所以用 while不断的判断是否是期望的,不是,就wait的死死的;是,就进入下面打印
            try {
                 Synchronized_Print.class.wait();//当前类的锁
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        
        //线程1,2,3一次1~60
        System.out.print("线程"+Thread.currentThread().getName()+ ":");
        for(int i=0; i<5; i++)
        {
            if(i > 0){//符合条件的有1 2 3 4 元素的前面加 ,
                System.out.print(",");
            }
            System.out.print(num++);
        }
        System.out.println();

        //一个线程输出完,计数器+1
        index=(index%3)+1; //模3从0开始,       1 2 3
        //唤醒其他等待线程
        Synchronized_Print.class.notifyAll(); //唤醒全部,去争夺监视器锁,是我们期望的抢到了,就往下 执行;不然,又把他wait(同时会释放锁);又开始争夺
                                             //notify(可能唤醒不到想要的,引起不必要的阻塞) 
    }

    public static void main(String[] args) {
        for(int i=0; i<3; i++){//创建3个线程
            new Thread(""+i){//转为字符串类型
                @Override
                public void run() {
                    for(int j=0; j<4; j++){//每次每个线程分别打印5个数字,需要4轮
                        print();
                    }
                }
            }.start();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值