Skip to content

Commit 79210c9

Browse files
committed
✨ Introducing new features. 新增一种线程通信
1 parent 07a0692 commit 79210c9

File tree

2 files changed

+127
-3
lines changed

2 files changed

+127
-3
lines changed

MD/concurrent/thread-communication.md

+75
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,81 @@ CountDownLatch 也是基于 AQS(AbstractQueuedSynchronizer) 实现的,更多
334334
- 该方法会将 AQS 内置的一个 state 状态 -1 。
335335
- 最终在主线程调用 await() 方法,它会阻塞直到 `state == 0` 的时候返回。
336336

337+
## CyclicBarrier 并发工具
338+
339+
```java
340+
private static void cyclicBarrier() throws Exception {
341+
CyclicBarrier cyclicBarrier = new CyclicBarrier(3) ;
342+
343+
new Thread(new Runnable() {
344+
@Override
345+
public void run() {
346+
LOGGER.info("thread run");
347+
try {
348+
cyclicBarrier.await() ;
349+
} catch (Exception e) {
350+
e.printStackTrace();
351+
}
352+
353+
LOGGER.info("thread end do something");
354+
}
355+
}).start();
356+
357+
new Thread(new Runnable() {
358+
@Override
359+
public void run() {
360+
LOGGER.info("thread run");
361+
try {
362+
cyclicBarrier.await() ;
363+
} catch (Exception e) {
364+
e.printStackTrace();
365+
}
366+
367+
LOGGER.info("thread end do something");
368+
}
369+
}).start();
370+
371+
new Thread(new Runnable() {
372+
@Override
373+
public void run() {
374+
LOGGER.info("thread run");
375+
try {
376+
Thread.sleep(5000);
377+
cyclicBarrier.await() ;
378+
} catch (Exception e) {
379+
e.printStackTrace();
380+
}
381+
382+
LOGGER.info("thread end do something");
383+
}
384+
}).start();
385+
386+
LOGGER.info("main thread");
387+
}
388+
```
389+
390+
CyclicBarrier 中文名叫做屏障或者是栅栏,也可以用于线程间通信。
391+
392+
它可以等待 N 个线程都达到某个状态后继续运行的效果。
393+
394+
1. 首先初始化线程参与者。
395+
2. 调用 `await()` 将会在所有参与者线程都调用之前等待。
396+
3. 直到所有参与者都调用了 `await()` 后,所有线程从 `await()` 返回继续后续逻辑。
397+
398+
运行结果:
399+
400+
```
401+
2018-03-18 22:40:00.731 [Thread-0] INFO c.c.actual.ThreadCommunication - thread run
402+
2018-03-18 22:40:00.731 [Thread-1] INFO c.c.actual.ThreadCommunication - thread run
403+
2018-03-18 22:40:00.731 [Thread-2] INFO c.c.actual.ThreadCommunication - thread run
404+
2018-03-18 22:40:00.731 [main] INFO c.c.actual.ThreadCommunication - main thread
405+
2018-03-18 22:40:05.741 [Thread-0] INFO c.c.actual.ThreadCommunication - thread end do something
406+
2018-03-18 22:40:05.741 [Thread-1] INFO c.c.actual.ThreadCommunication - thread end do something
407+
2018-03-18 22:40:05.741 [Thread-2] INFO c.c.actual.ThreadCommunication - thread end do something
408+
```
409+
410+
可以看出由于其中一个线程休眠了五秒,所有其余所有的线程都得等待这个线程调用 `await()`
411+
337412
## 线程响应中断
338413

339414
```java

src/main/java/com/crossoverjie/actual/ThreadCommunication.java

+52-3
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,67 @@ public class ThreadCommunication {
2020
private final static Logger LOGGER = LoggerFactory.getLogger(ThreadCommunication.class);
2121

2222
public static void main(String[] args) throws Exception {
23-
join();
23+
//join();
2424
//executorService();
2525
//countDownLatch();
2626
//piped();
27-
27+
cyclicBarrier();
2828
}
2929

3030
/**
31-
* 使用countDownLatch 每执行完一个就减一,最后等待全部完成
31+
* CyclicBarrier
3232
*
3333
* @throws Exception
3434
*/
35+
private static void cyclicBarrier() throws Exception {
36+
CyclicBarrier cyclicBarrier = new CyclicBarrier(3) ;
37+
38+
new Thread(new Runnable() {
39+
@Override
40+
public void run() {
41+
LOGGER.info("thread run");
42+
try {
43+
cyclicBarrier.await() ;
44+
} catch (Exception e) {
45+
e.printStackTrace();
46+
}
47+
48+
LOGGER.info("thread end do something");
49+
}
50+
}).start();
51+
52+
new Thread(new Runnable() {
53+
@Override
54+
public void run() {
55+
LOGGER.info("thread run");
56+
try {
57+
cyclicBarrier.await() ;
58+
} catch (Exception e) {
59+
e.printStackTrace();
60+
}
61+
62+
LOGGER.info("thread end do something");
63+
}
64+
}).start();
65+
66+
new Thread(new Runnable() {
67+
@Override
68+
public void run() {
69+
LOGGER.info("thread run");
70+
try {
71+
Thread.sleep(5000);
72+
cyclicBarrier.await() ;
73+
} catch (Exception e) {
74+
e.printStackTrace();
75+
}
76+
77+
LOGGER.info("thread end do something");
78+
}
79+
}).start();
80+
81+
LOGGER.info("main thread");
82+
}
83+
3584
private static void countDownLatch() throws Exception {
3685
int thread = 3;
3786
long start = System.currentTimeMillis();

0 commit comments

Comments
 (0)