0%

1116-打印零与奇偶数

前言:学习JUC包后,通过leetcode多线程的题目练习一下,1116-打印零与奇偶数

Semaphore

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public class ZeroEvenOdd {
private int n;
private final int SIZE = 3;
private Semaphore[] semaphores = new Semaphore[SIZE];

public ZeroEvenOdd(int n) {
this.n = n;
for (int i = 0; i < SIZE; i++) {
semaphores[i] = new Semaphore(0);
}
}

// printNumber.accept(x) outputs "x", where x is an integer.
public void zero(IntConsumer printNumber) throws InterruptedException {
for (int i = 1; i <= n; i++) {
printNumber.accept(0);
if (i % 2 == 0) {
semaphores[2].release();
} else {
semaphores[1].release();
}
semaphores[0].release();
}
}

public void even(IntConsumer printNumber) throws InterruptedException {
for (int i = 2; i <= n; i += 2) {
semaphores[2].acquire();
printNumber.accept(i);
semaphores[0].release();

}
}

public void odd(IntConsumer printNumber) throws InterruptedException {
for (int i = 1; i <= n; i += 2) {
semaphores[1].acquire();
printNumber.accept(i);
semaphores[0].release();
}
}
}

管程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
public class ZeroEvenOdd {
private int n;
private ReentrantLock lock = new ReentrantLock();
private Condition zero = lock.newCondition();
private Condition notZero = lock.newCondition();
private AtomicInteger semaphore = new AtomicInteger(0);

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++) {
lock.lock();
try {
while (semaphore.intValue() != 0) {
zero.await();
}
printNumber.accept(0);
if (i % 2 == 0) {
semaphore.getAndSet(2);
} else {
semaphore.getAndSet(1);
}
notZero.signalAll();
} finally {
lock.unlock();
}
}
}

public void even(IntConsumer printNumber) throws InterruptedException {
for (int i = 2; i <= n; i += 2) {
lock.lock();
try {
while (semaphore.intValue() != 2) {
notZero.await();
}
printNumber.accept(i);
semaphore.getAndSet(0);
zero.signal();
} finally {
lock.unlock();
}

}
}

public void odd(IntConsumer printNumber) throws InterruptedException {
for (int i = 1; i <= n; i += 2) {
lock.lock();
try {
while (semaphore.intValue() != 1) {
notZero.await();
}
printNumber.accept(i);
semaphore.getAndSet(0);
zero.signal();
} finally {
lock.unlock();
}

}
}
}
-------------本文结束感谢您的阅读-------------