智能建站系統(tǒng)怎么更換網(wǎng)站模板東莞互聯(lián)網(wǎng)推廣
現(xiàn)有函數(shù)?printNumber
?可以用一個(gè)整數(shù)參數(shù)調(diào)用,并輸出該整數(shù)到控制臺(tái)。
- 例如,調(diào)用?
printNumber(7)
?將會(huì)輸出?7
?到控制臺(tái)。
給你類?ZeroEvenOdd
?的一個(gè)實(shí)例,該類中有三個(gè)函數(shù):zero
、even
?和?odd
?。ZeroEvenOdd
?的相同實(shí)例將會(huì)傳遞給三個(gè)不同線程:
- 線程 A:調(diào)用?
zero()
?,只輸出?0
- 線程 B:調(diào)用?
even()
?,只輸出偶數(shù) - 線程 C:調(diào)用?
odd()
?,只輸出奇數(shù)
修改給出的類,以輸出序列?"010203040506..."
?,其中序列的長(zhǎng)度必須為?2n
?。
實(shí)現(xiàn)?ZeroEvenOdd
?類:
ZeroEvenOdd(int n)
?用數(shù)字?n
?初始化對(duì)象,表示需要輸出的數(shù)。void zero(printNumber)
?調(diào)用?printNumber
?以輸出一個(gè) 0 。void even(printNumber)
?調(diào)用printNumber
?以輸出偶數(shù)。void odd(printNumber)
?調(diào)用?printNumber
?以輸出奇數(shù)。
示例 1:
輸入:n = 2 輸出:"0102" 解釋:三條線程異步執(zhí)行,其中一個(gè)調(diào)用 zero(),另一個(gè)線程調(diào)用 even(),最后一個(gè)線程調(diào)用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);//奇數(shù)private Semaphore evenSema = new Semaphore(0);//偶數(shù)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) {//奇數(shù)oddSema.release();} else {evenSema.release();}}}public void even(IntConsumer printNumber) throws InterruptedException {for (int i = 1; i <= n; i++) {if (i % 2== 0) {//偶數(shù) 打印偶數(shù) 并釋放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) {//奇數(shù),打印奇數(shù),并釋放zero的線程oddSema.acquire();printNumber.accept(i);zeroSema.release();}}}
}
2.?synchronized
class ZeroEvenOdd {private int n;private final Object ob=new Object();private volatile int flag=0;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%2==0)flag=2;elseflag=1;ob.notifyAll();}}}public void even(IntConsumer printNumber) throws InterruptedException {for (int i = 1; i <= n; i++) {if (i % 2== 0) {//偶數(shù) 打印偶數(shù) 并釋放zero的線程synchronized (ob){while (flag!=2){ob.wait();}printNumber.accept(i);flag=0;ob.notifyAll();}}}}public void odd(IntConsumer printNumber) throws InterruptedException {for (int i = 1; i <= n; i++) {if (i % 2!= 0) {//偶數(shù) 打印偶數(shù) 并釋放zero的線程synchronized (ob){while (flag!=1){ob.wait();}printNumber.accept(i);flag=0;ob.notifyAll();}}}}
}
3. CountDownLatch
class ZeroEvenOdd {private int n;private CountDownLatch countDownLatch_zero=new CountDownLatch(0);private CountDownLatch countDownLatch_even=new CountDownLatch(1);private CountDownLatch countDownLatch_odd=new 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_zero=new CountDownLatch(1);if (i % 2!= 0) {//奇數(shù)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) {//偶數(shù) 打印偶數(shù) 并釋放zero的線程countDownLatch_even.await();printNumber.accept(i);countDownLatch_even=new CountDownLatch(1);countDownLatch_zero.countDown();}}}public void odd(IntConsumer printNumber) throws InterruptedException {for (int i = 1; i <= n; i++) {if (i % 2 != 0) {//奇數(shù),打印奇數(shù),并釋放zero的線程countDownLatch_odd.await();printNumber.accept(i);countDownLatch_odd=new CountDownLatch(1);countDownLatch_zero.countDown();}}}
}
4. Lock
class ZeroEvenOdd {private int n;private volatile int flag=0;Lock lock=new 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%2==0) {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) {//偶數(shù) 打印偶數(shù) 并釋放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) {//偶數(shù) 打印偶數(shù) 并釋放zero的線程lock.lock();try {while (flag != 1) {condition_odd.await();}printNumber.accept(i);flag = 0;condition_zero.signal();}finally {lock.unlock();}}}}
}