春招打卡d2n03-leetcode刷题1116打印零与奇偶数

160 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

leetcode刷题1116打印零与奇偶数

前文

本文为leetcode多线程类型题目,题目序号为1116,主要考察对于多线程相关知识的应用。

题目信息

现有函数 printNumber 可以用一个整数参数调用,并输出该整数到控制台。

给你类 ZeroEvenOdd 的一个实例,该类中有三个函数:zero、even 和 odd 。ZeroEvenOdd 的相同实例将会传递给三个不同线程:

线程 A:调用 zero() ,只输出 0 线程 B:调用 even() ,只输出偶数 线程 C:调用 odd() ,只输出奇数 修改给出的类,以输出序列 "010203040506..." ,其中序列的长度必须为 2n 。

解题思路

根据题目的描述信息,简单来说是对于多个线程进行顺序控制,使得三个线程能够实现交替运行。而目标主要是打印0的线程在每一轮中都会执行,另外的奇偶数则会交替运行。而解体思路是采用线程控制的关键字,CountDownLatch。初始化阶段预先新建三个该关键字,在线程的执行时进行控制。每个线程执行完毕后进行其他指定线程的关键字处理,以此释放给其他线程操作权。按此方式采用循环完毕即可得到目标结果。

解题代码

class ZeroEvenOdd {
    private int n;
    private CountDownLatch countDownLatch1 = new CountDownLatch(1);//奇数
    private CountDownLatch countDownLatch2 = new CountDownLatch(1);//偶数
    private CountDownLatch countDownLatch3 = new CountDownLatch(1);

    public ZeroEvenOdd(int n) {
        this.n = n;
    }

    // printNumber.accept(x) outputs "x", where x is an integer.
    public void zero(IntConsumer printNumber) throws InterruptedException {
        for (int i = 1; i <= n; i++) {
            if(i != 1){
                countDownLatch3.await();
                countDownLatch3 = new CountDownLatch(1);
            }
            printNumber.accept(0);
            if(i%2 == 0){//偶数
                countDownLatch2.countDown();
            }else{
                countDownLatch1.countDown();
            }
        }
    }

    //    偶数
    public void even(IntConsumer printNumber) throws InterruptedException {
        for (int i = 2; i <= n ; i = i + 2) {
            countDownLatch2.await();
            printNumber.accept(i);
            countDownLatch2 = new CountDownLatch(1);
            countDownLatch3.countDown();
//            countDownLatch1.countDown();
        }
    }

    //    奇数
    public void odd(IntConsumer printNumber) throws InterruptedException {
        for (int i = 1; i <= n ; i = i + 2) {
            countDownLatch1.await();
            printNumber.accept(i);
            countDownLatch1 = new CountDownLatch(1);
            countDownLatch3.countDown();
        }
    }
}

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。