java 多线程 可重入锁RentrantLock

本文介绍如何使用Java中的Condition来实现三个任务的循环执行,通过ReentrantLock和Condition的配合,确保线程按指定顺序执行,并在完成一轮后重新开始,适用于需要精确控制线程执行顺序的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.业务场景,实现一个排队功能,比如 1,2,3   执行完成之后,重新从1,2,3 继续执行下去

public static void main(String[] args) {
        final Business business=new Business();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i=0;i<100;i++){
                    business.one2();
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i=0;i<100;i++){
                    business.one3();
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i=0;i<100;i++){
                    business.one1();
                }
            }
        }).start();
    }
}

class Business {
    Lock lock = new ReentrantLock();
    Condition condition1 = lock.newCondition();
    Condition condition2 = lock.newCondition();
    Condition condition3 = lock.newCondition();
    int lockCount = 1;

    public void one1() {
        lock.lock();
        if (lockCount != 1) {
            try {
                condition1.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("----one1");
        lockCount = 2;
        condition2.signal();
        lock.unlock();
    }

    public void one2() {
        lock.lock();
        if (lockCount != 2) {
            try {
                condition2.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("----one2");
        lockCount = 3;
        condition3.signal();
        lock.unlock();
    }

    public void one3() {
        lock.lock();
        if (lockCount != 3) {
            try {
                condition3.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("----one3");
        lockCount = 1;
        condition1.signal();
        lock.unlock();
    }
}

关键知识点:

Condition  中signal 唤醒一个在此条件下正在等待的线程,signalAll 唤醒在此条件下等待的所有线程

 

方法解释:Lock 获取锁
lock.tryLock() : 尝试去获取空闲的锁,如果有返回true,没有返回false;

  lock.lock() :获取锁,会不停的获取,产生阻塞,已经被中断,但还会继续获取

  lock.tryLock(time,类型) 获取最大这个时间之后,如果 time之后还未获取到锁,会抛出异常 InterruptedException

  lock.lockInterruptibly  获取锁,如果已经中断了,停止,lockInterruptibly()和上面lock是一样的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值