avatar

目录
一道多线程面试题——使用两个线程轮流打印1到100

某天,在某个公众号上看到大佬的一份面经,里边出现了这道题.

原题描述是这样的:

使用两个线程打印数字1到100。要求:一个线程打印奇数,另一个打印偶数,并且按照1到100从小到大的顺序正确打印。

下面直接上代码,给出我的实现:

1. 使用Lock实现

java
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
package me.chan;

import java.util.concurrent.locks.ReentrantLock;

public class Sout1To100 {

private static final ReentrantLock lock = new ReentrantLock();

private static volatile int num = 1;

private static volatile boolean flag = false;

public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(()->{
while (num <= 100) {
if (flag) {
try {
lock.lock();
System.out.println(Thread.currentThread().getName()+":"+num);
++num;
flag = false;
} finally {
lock.unlock();
}

}
}
});

Thread t2 = new Thread(()->{

while (num <= 100) {
if (!flag) {
try {
lock.lock();
System.out.println(Thread.currentThread().getName()+":"+num);
++num;
flag = true;
} finally {
lock.unlock();
}
}
}
});

t1.start();
t2.start();
t1.join();
t2.join();
}

2. 使用notify()和wait()实现

java
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
package me.chan;

public class Sout1To100 {

private static final Object lock = new Object();

private static volatile int num = 1;

private static volatile boolean flag = true;

public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(()->{

while (num <= 100) {
if (flag) {

synchronized(lock) {
lock.notify();
System.out.println(Thread.currentThread().getName()+":"+num);
++num;
try {
flag = false;
lock.wait(10);
} catch (Exception e) {
e.printStackTrace();
}

}
}
}
});

Thread t2 = new Thread(()->{
while (num <= 100) {
if (!flag) {
synchronized(lock) {
lock.notify();
System.out.println(Thread.currentThread().getName()+":"+num);
++num;
try {
flag = true;
lock.wait(10);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
});

t1.start();
t2.start();
t1.join();
t2.join();

}

}
文章作者: JanGin
文章链接: http://jangin.github.io/2020/08/07/using-two-threads-to-print-1-to-100-alternately/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 JanGin's BLOG

评论