需求:模拟3*10mi的接力赛,分别有三个线程,A , B,C 分别打印1 - 10 , 11 - 20 , 21 - 30 并且完成线程的顺序交替打印。实现代码如下:
其实可以使用jon来实现,但是这样做的效率并不是很高。
package hello_java;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Customize_Thread {
public static void main(String[] args) {
ShareData shareData = new ShareData();
new Thread(() -> {
shareData.print10();
},"A").start();
new Thread(() -> {
shareData.print20();
},"C").start();
new Thread(() -> {
shareData.print30();
},"B").start();
}
}
class ShareData{
public int flag = 1;
private Lock lock = new ReentrantLock();
private Condition condition1 = lock.newCondition();
private Condition condition2 = lock.newCondition();
private Condition condition3 = lock.newCondition();
public void print10(){
lock.lock();
try {
while(flag != 1){
condition1.await();
}
for (int i = 1; i <= 10; i++) {
System.out.println(i);
}
flag = 2;
condition2.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void print20(){
lock.lock();
try {
while(flag != 2){
condition2.await();
}
for (int i = 11; i <= 20; i++) {
System.out.println(i);
}
flag = 3;
condition3.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void print30(){
lock.lock();
try {
while(flag != 3){
condition3.await();
}
for (int i = 21; i <= 30; i++) {
System.out.println(i);
}
flag = 3;
condition1.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
运行结果如下:
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
Process finished with exit code 0