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();
}
}
}
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。