LeetCode(多线程)- 1116. 打印零与奇偶数

简介: LeetCode(多线程)- 1116. 打印零与奇偶数

题目链接:点击打开链接

题目大意:略。

解题思路:略。

相关企业

  • 爱奇艺

AC 代码

// 解决方案(1)
class ZeroEvenOdd {
    private int n;
    private volatile int state;
    public ZeroEvenOdd(int n) {
        this.n = n;
    }
    public void zero(IntConsumer printNumber) throws InterruptedException {
        for (int i = 0; i < n; i++) {
            while (state != 0) {
                Thread.yield();
            }
            printNumber.accept(0);
            if (i % 2 == 0) {
                state = 1;
            } else {
                state = 2;
            }
        }
    }
    public void even(IntConsumer printNumber) throws InterruptedException {
        for (int i = 2; i <= n; i += 2) {
            while (state != 2) {
                Thread.yield();
            }
            printNumber.accept(i);
            state = 0;
        }
    }
    public void odd(IntConsumer printNumber) throws InterruptedException {
        for (int i = 1; i <= n; i += 2) {
            while (state != 1) {
                Thread.yield();
            }
            printNumber.accept(i);
            state = 0;
        }
    }
}
// 解决方案(2)
class ZeroEvenOdd {
    private int n;
    private volatile int type = 0;
    private volatile boolean flag = true;
    private final Object obj = new Object();
    private volatile int num = 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 {
        while (true) {
            synchronized (obj) {
                while (type != 0) {
                    obj.wait();
                }
                if (num > n) {
                    flag = false;
                    obj.notifyAll();
                    return;
                }
                printNumber.accept(0);
                if (num % 2 == 1) {
                    type = 1;
                } else {
                    type = 2;
                }
                obj.notifyAll();
            }
        }
    }
    public void even(IntConsumer printNumber) throws InterruptedException {
        while (true) {
            synchronized (obj) {
                while (flag && type != 2) {
                    obj.wait();
                }
                if (num > n) {
                    obj.notifyAll();
                    return;
                }
                printNumber.accept(num++);
                type = 0;
                obj.notifyAll();
            }
        }
    }
    public void odd(IntConsumer printNumber) throws InterruptedException {
        while (true) {
            synchronized (obj) {
                while (flag && type != 1) {
                    obj.wait();
                }
                if (num > n) {
                    obj.notifyAll();
                    return;
                }
                printNumber.accept(num++);
                type = 0;
                obj.notifyAll();
            }
        }
    }
}
目录
相关文章
|
7月前
|
人工智能 算法 测试技术
map|动态规划|单调栈|LeetCode975:奇偶跳
map|动态规划|单调栈|LeetCode975:奇偶跳
【Leetcode -1609.奇偶树 -1122.数组的相对排序】
【Leetcode -1609.奇偶树 -1122.数组的相对排序】
53 0
|
算法 索引
【Leetcode -328.奇偶链表 - 725.分隔链表】
【Leetcode -328.奇偶链表 - 725.分隔链表】
36 0
|
4月前
|
索引 Python
【Leetcode刷题Python】328. 奇偶链表
在不使用额外空间的情况下,将链表中的奇数和偶数索引节点重新排序的方法,并提供了相应的Python实现代码。
40 0
|
3月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
7月前
|
索引
每日一题:力扣328. 奇偶链表
每日一题:力扣328. 奇偶链表
47 4
|
7月前
|
算法 C++
【刷题】Leetcode 1609.奇偶树
这道题是我目前做过最难的题,虽然没有一遍做出来,但是参考大佬的代码,慢慢啃的感觉的真的很好。刷题继续!!!!!!
41 0
|
7月前
Leetcode之多线程编程题
现有函数 printNumber 可以用一个整数参数调用,并输出该整数到控制台。 例如,调用 printNumber(7) 将会输出 7 到控制台。 给你类 ZeroEvenOdd 的一个实例,该类中有三个函数:zero、even 和 odd 。ZeroEvenOdd 的相同实例将会传递给三个不同线程:
117 1
|
7月前
|
人工智能 算法 测试技术
map|动态规划|单调栈|LeetCode975:奇偶跳
map|动态规划|单调栈|LeetCode975:奇偶跳