import java.util.concurrent.Semaphore;
import java.util.function.IntConsumer;
public class ParallePrintNumber {
public static void main(String[] argv) throws Exception {
ZeroOddEven zeroOddEven = new ZeroOddEven(9);
IntConsumer consumer = i -> System.out.print(i);
new Thread(() -> zeroOddEven.addZero(consumer), "Thread-0").start();
new Thread(() -> zeroOddEven.addOdd(consumer), "Thread-Odd").start();
new Thread(() -> zeroOddEven.addEven(consumer), "Thread-Even").start();
Thread.sleep(10000);
}
public static class ZeroOddEven {
Semaphore zero = new Semaphore(1);
Semaphore odd = new Semaphore(0);
Semaphore even = new Semaphore(0);
int maxNumber;
public ZeroOddEven(int maxNumber) {
this.maxNumber = maxNumber;
}
public void addZero(IntConsumer printer) {
try {
for(int i =0; i < maxNumber; i++) {
zero.acquire();
printer.accept(0);
if ((i&1) == 0) {
odd.release();
} else {
even.release();
}
}
} catch (InterruptedException ex) {
}
System.out.println(Thread.currentThread());
}
public void addOdd(IntConsumer printer) {
try {
for(int i = 1; i<= maxNumber; i += 2) {
odd.acquire();
printer.accept(i);
zero.release();
}
} catch (InterruptedException ex) {
}
System.out.println(Thread.currentThread());
}
public void addEven(IntConsumer printer) {
try {
for(int i = 2; i<= maxNumber; i += 2) {
even.acquire();
printer.accept(i);
zero.release();
}
} catch (InterruptedException ex) {
}
System.out.println(Thread.currentThread());
}
}
}
三个线程交替打印零和奇偶数
最新推荐文章于 2023-07-24 16:19:36 发布