复制代码
package com.atgu;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

class ShareDate2{
    private int nums=1;
    Lock lock=new ReentrantLock();
    Condition condition1 = lock.newCondition();
    Condition condition2 = lock.newCondition();
    Condition condition3 = lock.newCondition();


    public void print5(){
        lock.lock();
        try {
            while (nums!=1)
            {
                condition1.await();

            }
            for (int i = 5; i > 0; i--) {
                System.out.println(Thread.currentThread().getName()+i);
            }
            nums=2;
            condition2.signal();

        } catch (Exception e) {
          e.printStackTrace();
        } finally {
          lock.unlock();
        }
    }
    public void print10(){
        lock.lock();
        try {
            while (nums!=2)
            {
                condition2.await();

            }
            for (int i = 10; i > 0; i--) {
                System.out.println(Thread.currentThread().getName()+i);
            }
            nums=5;
            condition3.signal();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    public void print15(){
        lock.lock();
        try {
            while (nums!=5)
            {
                condition3.await();

            }
            for (int i = 15; i > 0; i--) {
                System.out.println(Thread.currentThread().getName()+i);
            }
            nums=1;
            condition1.signal();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }


}
public class SyncAndReentrtrantLockDemo {
    public static void main(String[] args) {
        ShareDate2 shareDate2 = new ShareDate2();
        new Thread(()->{
            for (int i = 10; i > 0; i--) {
                shareDate2.print5();
            }


        },"A").start();
        new Thread(()->{
            for (int i = 10; i > 0; i--) {
                shareDate2.print10();
            }


        },"B").start();
        new Thread(()->{
            for (int i = 10; i > 0; i--) {
                shareDate2.print15();
            }


        },"C").start();
    }
}
复制代码

 

posted on   upupup-999  阅读(47)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!



点击右上角即可分享
微信分享提示