多线程-ReentrantLock的原理以及使用

/**
 * 两个线程之间通信根据不同的条件进行不同的通信
 * 1.await()其他程阻塞,要是当前线程向下执行,那么其他的线程必须唤醒它本身,这样当前线程才可以继续向下执行
 * 2.signal()唤醒当前线程
 */
public class Main {
    static class NumberWrapper {
        public int value = 1;
    }

    public static void main(String[] args) {
        //初始化可重入锁
        final Lock lock = new ReentrantLock();
        //创建两个线程
        //1.读线程
        //2.写线程
        final Condition reachThreeCondition = lock.newCondition();
        final Condition reachSixCondition = lock.newCondition();

        final NumberWrapper num = new NumberWrapper();
        //初始化A线程
        //输出3的线程
        Thread threadA = new Thread(new Runnable() {
            @Override
            public void run() {
                //需要先获得锁
                lock.lock();
                try {
                    System.out.println("ThreadA start write");
                    //A线程先输出前三个数
                    while (num.value <= 3) {
                        System.out.println(num);
                        num.value++;
                    }
                    //输出到3时,告诉B线程,当前线程阻塞,唤醒,是一个互对的关系
                    reachThreeCondition.signal();
                } finally {
                    lock.unlock();  //释放锁
                }
                lock.lock();
                //等待输出6的条件
                try {
                    reachSixCondition.await();
                    System.out.println("threadA start write");
                    //输出剩余数字
                    while (num.value <= 9) {
                        System.out.println(num.value);
                        num.value++;
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    lock.unlock();
                }
            }
        });
        //输出6的线程
        Thread threadB = new Thread(new Runnable() {
            @Override
            public void run() {
                lock.lock();
                try {
                    try {
                        //等待输出3的条件.当前的B线程阻塞,只有A线程满足3的条件输出了,那么
                        //才开始执行6的条件,这样是一个无线等待的情况,怎么获取每一个线程的执行结果
                        //1.要么通过参数进行参数的赋值关系,要么进行DB,这个是在项目中经常进行的操作
                        while (num.value <= 3) {
                            reachThreeCondition.await();
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } finally {
                    lock.unlock();
                }
                lock.lock();
                //接受到信号
                try {
                    System.out.println("threadB start write");
                    while (num.value <= 6) {
                        System.out.println(num.value);
                        num.value++;
                    }
                    //4,5,6输出完毕,告诉A线程6输出完了
                    reachSixCondition.signal();
                } finally {
                    lock.unlock();
                }
            }
        });
        //启动两个线程
        threadB.start();
        threadA.start();
    }

可以参考以下的一个博客

https://www.cnblogs.com/hongdada/p/6150699.html

写的很详细,并且比较了Object类和当前类的方法的区别,以及用法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值