题目链接:点击打开链接
题目大意:略。
解题思路:略。
相关企业
- 爱奇艺
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(); } } } }