如何使用三个线程顺序打印“A“,“B“,“C“

如何使用三个线程顺序打印“A“,“B“,“C“,第1张

如何使用三个线程顺序打印“A“,“B“,“C“

需要使用lock的Condition接口来实现三个线程顺序打印

* Lock
 * condition.await();
 * condition.signal();
 * condition.signalAll();
 * 和wait(), notify(), notifyALl() 功能差不多
 *    区别    notify唤醒
 *          signal唤醒某一把锁
 *
 */
class ShareData{
    //为何用Lock   Lock可以设置多把锁和多把钥匙 可以定向唤醒  Lockgood_demo
    private int number = 1;//a:1  b:2  c:3
    //synchronized重锁1.8前
    private Lock lock=new ReentrantLock();//ReentrantLock递归锁 非公平锁  新版的
    private Condition c1=lock.newCondition();//多把钥匙   多吧锁
    private Condition c2=lock.newCondition();
    private Condition c3=lock.newCondition();
    public  void printc1() {
        lock.lock();
        try{
            while (number!=1){c1.await();}//if可能有虚假唤醒//1.判断
            System.out.println(Thread.currentThread().getName()+"t执行");//2.干活
            number=2;c2.signalAll(); //3.通知
        }catch (Exception e){e.printStackTrace();}finally {lock.unlock();}
    }
    public  void printc2() {
        lock.lock();
        try{
            while (number!=2){c2.await();}//if可能有虚假唤醒//1.判断
            System.out.println(Thread.currentThread().getName()+"t执行");//2.干活
            number=3;c3.signalAll();//3.通知
        }catch (Exception e){e.printStackTrace();}finally {lock.unlock();}
    }
    public  void printc3() {
        lock.lock();
        try{
            while (number!=3){c3.await();}//if可能有虚假唤醒//1.判断
            System.out.println(Thread.currentThread().getName()+"t执行");//2.干活
            number=1;c1.signalAll(); //3.通知
        }catch (Exception e){e.printStackTrace();}finally {lock.unlock();}
    }
}

public static void main(String[] args) {
        Lockgood_demo();
    }

    private static  void Lockgood_demo() {
        ShareData shareData=new ShareData();
        //顺序打印五遍A B C
        new Thread(()->{for (int i = 0; i < 5; i++) shareData.printc1();},"A").start();
        new Thread(()->{for (int i = 0; i < 5; i++) shareData.printc2();},"B").start();
        new Thread(()->{for (int i = 0; i < 5; i++) shareData.printc3();},"C").start();

    }   //精确唤醒某些线程  private Condition c1=lock.newCondition();//多把钥匙   多把锁

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5595940.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存