网站建设多少钱裙,旧房改造装修翻新,提高百度搜索排名,做网站需要多大的内存现有函数 printNumber 可以用一个整数参数调用#xff0c;并输出该整数到控制台。
例如#xff0c;调用 printNumber(7) 将会输出 7 到控制台。
给你类 ZeroEvenOdd 的一个实例#xff0c;该类中有三个函数#xff1a;zero、even 和 odd 。ZeroEvenOdd 的相同实例将会传递…现有函数 printNumber 可以用一个整数参数调用并输出该整数到控制台。
例如调用 printNumber(7) 将会输出 7 到控制台。
给你类 ZeroEvenOdd 的一个实例该类中有三个函数zero、even 和 odd 。ZeroEvenOdd 的相同实例将会传递给三个不同线程
线程 A调用 zero() 只输出 0线程 B调用 even() 只输出偶数线程 C调用 odd() 只输出奇数
修改给出的类以输出序列 010203040506... 其中序列的长度必须为 2n 。
实现 ZeroEvenOdd 类
ZeroEvenOdd(int n) 用数字 n 初始化对象表示需要输出的数。void zero(printNumber) 调用 printNumber 以输出一个 0 。void even(printNumber) 调用printNumber 以输出偶数。void odd(printNumber) 调用 printNumber 以输出奇数。 示例 1
输入n 2
输出0102
解释三条线程异步执行其中一个调用 zero()另一个线程调用 even()最后一个线程调用odd()。正确的输出为 0102。示例 2
输入n 5
输出0102030405
1. Semaphore
class ZeroEvenOdd {private int n;private Semaphore zeroSema new Semaphore(1);private Semaphore oddSema new Semaphore(0);//奇数private Semaphore evenSema new Semaphore(0);//偶数public ZeroEvenOdd(int n) {this.n n;}public void zero(IntConsumer printNumber) throws InterruptedException {for (int i 1; i n; i) {zeroSema.acquire();printNumber.accept(0);if (i % 2! 0) {//奇数oddSema.release();} else {evenSema.release();}}}public void even(IntConsumer printNumber) throws InterruptedException {for (int i 1; i n; i) {if (i % 2 0) {//偶数 打印偶数 并释放zero的线程evenSema.acquire();printNumber.accept(i);zeroSema.release();}}}public void odd(IntConsumer printNumber) throws InterruptedException {for (int i 1; i n; i) {if (i % 2 ! 0) {//奇数打印奇数并释放zero的线程oddSema.acquire();printNumber.accept(i);zeroSema.release();}}}
}2. synchronized
class ZeroEvenOdd {private int n;private final Object obnew Object();private volatile int flag0;public ZeroEvenOdd(int n) {this.n n;}public void zero(IntConsumer printNumber) throws InterruptedException {for (int i 1; i n; i) {synchronized (ob){while (flag!0){ob.wait();}printNumber.accept(0);if(i%20)flag2;elseflag1;ob.notifyAll();}}}public void even(IntConsumer printNumber) throws InterruptedException {for (int i 1; i n; i) {if (i % 2 0) {//偶数 打印偶数 并释放zero的线程synchronized (ob){while (flag!2){ob.wait();}printNumber.accept(i);flag0;ob.notifyAll();}}}}public void odd(IntConsumer printNumber) throws InterruptedException {for (int i 1; i n; i) {if (i % 2! 0) {//偶数 打印偶数 并释放zero的线程synchronized (ob){while (flag!1){ob.wait();}printNumber.accept(i);flag0;ob.notifyAll();}}}}
}
3. CountDownLatch
class ZeroEvenOdd {private int n;private CountDownLatch countDownLatch_zeronew CountDownLatch(0);private CountDownLatch countDownLatch_evennew CountDownLatch(1);private CountDownLatch countDownLatch_oddnew CountDownLatch(1);public ZeroEvenOdd(int n) {this.n n;}public void zero(IntConsumer printNumber) throws InterruptedException {for (int i 1; i n; i) {countDownLatch_zero.await();printNumber.accept(0);countDownLatch_zeronew CountDownLatch(1);if (i % 2! 0) {//奇数countDownLatch_odd.countDown();} else {countDownLatch_even.countDown();}}}public void even(IntConsumer printNumber) throws InterruptedException {for (int i 1; i n; i) {if (i % 2 0) {//偶数 打印偶数 并释放zero的线程countDownLatch_even.await();printNumber.accept(i);countDownLatch_evennew CountDownLatch(1);countDownLatch_zero.countDown();}}}public void odd(IntConsumer printNumber) throws InterruptedException {for (int i 1; i n; i) {if (i % 2 ! 0) {//奇数打印奇数并释放zero的线程countDownLatch_odd.await();printNumber.accept(i);countDownLatch_oddnew CountDownLatch(1);countDownLatch_zero.countDown();}}}
}4. Lock
class ZeroEvenOdd {private int n;private volatile int flag0;Lock locknew ReentrantLock();Condition condition_zero lock.newCondition();Condition conditon_even lock.newCondition();Condition condition_odd lock.newCondition();public ZeroEvenOdd(int n) {this.n n;}public void zero(IntConsumer printNumber) throws InterruptedException {for (int i 1; i n; i) {lock.lock();try{while (flag!0){condition_zero.await();}printNumber.accept(0);if(i%20) {flag 2;conditon_even.signal();}else {flag 1;condition_odd.signal();}}finally {lock.unlock();}}}public void even(IntConsumer printNumber) throws InterruptedException {for (int i 1; i n; i) {if (i % 2 0) {//偶数 打印偶数 并释放zero的线程lock.lock();try {while (flag ! 2) {conditon_even.await();}printNumber.accept(i);flag 0;condition_zero.signal();}finally {lock.unlock();}}}}public void odd(IntConsumer printNumber) throws InterruptedException {for (int i 1; i n; i) {if (i % 2! 0) {//偶数 打印偶数 并释放zero的线程lock.lock();try {while (flag ! 1) {condition_odd.await();}printNumber.accept(i);flag 0;condition_zero.signal();}finally {lock.unlock();}}}}
}