一道线程间通信的算法题目

1 篇文章 0 订阅

题目是这样的

有三个线程,循环输出,需要按照顺序打印10次,比如线程1,线程2,线程3分别打印0,1,2

最后的输出结果就是012012......一共10次

 

public class LockThreadTest extends Thread{

    private int x ;

     static class MyClass {
         private static int x = 0;
     }

    public LockThreadTest(int x){
        this.x = x;
    }

    @Override
    public void run() {
        int i = 10;
        //循环控制notifyall后线程不会结束
        while (i-- > 0){
            //必须要一个全局对象来锁,三个线程使用同一把锁
            synchronized (MyClass.class){
                //如果不该本线程打印就wait等待并释放锁
                while (MyClass.x %3 != x){
                    try {
                        MyClass.class.wait();
                    }catch (Exception e){

                    }
                }
                System.out.print(x);
                MyClass.x++;
                MyClass.class.notifyAll();
            }
        }
    }

    public static void main(String[] args) {
        Thread lockThreadTest = new LockThreadTest(0);
        Thread lockThreadTest1 = new LockThreadTest(1);
        Thread lockThreadTest2 = new LockThreadTest(2);
        lockThreadTest.start();
        lockThreadTest1.start();
        lockThreadTest2.start();
    }
}

最后的输出结果是

 

解题过程:

1.notifyall()不会直接去唤醒等待的线程而是要等待该监视器锁被释放后才会让被唤醒的线程继续执行

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值