Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 4f6db96

Browse files
打印零与奇偶数
1 parent 126d0da commit 4f6db96

File tree

1 file changed

+100
-0
lines changed

1 file changed

+100
-0
lines changed
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package com.leetcode_cn.medium;
2+
3+
import java.util.concurrent.Semaphore;
4+
import java.util.function.IntConsumer;
5+
6+
/**************打印零与奇偶数**********/
7+
/**
8+
* 假设有这么一个类:
9+
*
10+
* class ZeroEvenOdd {
11+
*
12+
* public ZeroEvenOdd(int n) { ... } // 构造函数
13+
*
14+
* public void zero(printNumber) { ... } // 仅打印出 0
15+
*
16+
* public void even(printNumber) { ... } // 仅打印出 偶数
17+
*
18+
* public void odd(printNumber) { ... } // 仅打印出 奇数
19+
*
20+
* }
21+
*
22+
* 相同的一个 ZeroEvenOdd 类实例将会传递给三个不同的线程:
23+
*
24+
* 线程 A 将调用 zero(),它只输出 0 。
25+
*
26+
* 线程 B 将调用 even(),它只输出偶数。
27+
*
28+
* 线程 C 将调用 odd(),它只输出奇数。
29+
*
30+
* 每个线程都有一个 printNumber 方法来输出一个整数。请修改给出的代码以输出整数序列 010203040506... ,其中序列的长度必须为
31+
* 2n。
32+
*
33+
* 示例 1:
34+
*
35+
* 输入:n = 2
36+
*
37+
* 输出:"0102"
38+
*
39+
* 说明:三条线程异步执行,其中一个调用 zero(),另一个线程调用 even(),最后一个线程调用odd()。正确的输出为 "0102"。
40+
*
41+
* 示例 2:
42+
*
43+
* 输入:n = 5
44+
*
45+
* 输出:"0102030405"
46+
*
47+
* @author ffj
48+
*
49+
*/
50+
public class PrintZeroEvenOdd {
51+
52+
public static void main(String[] args) {
53+
}
54+
55+
class ZeroEvenOdd {
56+
private int n;
57+
private Semaphore zeroLock, evenLock, oddLock;
58+
59+
public ZeroEvenOdd(int n) {
60+
this.n = n;
61+
this.zeroLock = new Semaphore(1); // 跟锁性质一样
62+
this.evenLock = new Semaphore(0); // 一开始就阻塞
63+
this.oddLock = new Semaphore(0);
64+
}
65+
66+
// printNumber.accept(x) outputs "x", where x is an integer. 输出零
67+
public void zero(IntConsumer printNumber) throws InterruptedException {
68+
69+
for (int i = 1; i <= n; i++) {
70+
zeroLock.acquire();
71+
printNumber.accept(0);
72+
if ((i | 0) == 1) // 奇数
73+
oddLock.release();
74+
else
75+
evenLock.release();
76+
}
77+
}
78+
79+
// 输出偶数
80+
public void even(IntConsumer printNumber) throws InterruptedException {
81+
82+
for (int i = 2; i <= n; i += 2) {
83+
evenLock.acquire();
84+
printNumber.accept(i);
85+
zeroLock.release();
86+
}
87+
}
88+
89+
// 输出奇数
90+
public void odd(IntConsumer printNumber) throws InterruptedException {
91+
92+
for (int i = 1; i <= n; i += 2) {
93+
oddLock.acquire();
94+
printNumber.accept(i);
95+
zeroLock.release();
96+
}
97+
}
98+
}
99+
100+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /