CyclicBarrier,讓多線程齊步走。讓多個(gè)線程到達(dá)某一個(gè)點(diǎn)之后,再同時(shí)往下運(yùn)行。
思考這樣一個(gè)案例:兩個(gè)工人從兩端挖掘隧道,各自獨(dú)立奮戰(zhàn),中間不溝通,如果兩人在匯合點(diǎn)處碰頭了,則表明隧道已經(jīng)挖通。這描繪的也是在多線程編程中,兩個(gè)線程獨(dú)立運(yùn)行,在沒(méi)有線程間通信的情況下,如何解決兩個(gè)線程匯集在同一原點(diǎn)的問(wèn)題。Java提供了CyclicBarrier(關(guān)卡,也有翻譯為柵欄)工具類來(lái)實(shí)現(xiàn)。
代碼如下:
1 import java.util.Random; 2 import java.util.concurrent.CyclicBarrier;
3 import java.util.concurrent.TimeUnit;
4
5 public class CyclicBarrierTest {
6 public static void main(String[] args) {
7 // 設(shè)置匯集數(shù)量,以及匯集完成后的任務(wù)
8 CyclicBarrier cb = new CyclicBarrier(2, new Runnable() {
9 public void run() {
10 System.out.println("隧道已經(jīng)打通!");
11 }
12 });
13 // 工人1挖隧道
14 new Thread(new Worker(cb), "工人1").start();
15 // 工人2挖隧道
16 new Thread(new Worker(cb), "工人2").start();
17 }
18
19
20 static class Worker implements Runnable {
21 // 關(guān)卡
22 private CyclicBarrier cb;
23
24 public Worker(CyclicBarrier _cb) {
25 cb = _cb;
26 }
27
28 public void run() {
29 try {
30 TimeUnit.SECONDS.sleep(new Random().nextInt(10));
31 System.out.println(Thread.currentThread().getName() + "-到達(dá)匯合點(diǎn)");
32 // 到達(dá)匯合點(diǎn)
33 cb.await();
34 } catch (Exception e) {
35 // 異常處理
36 }
37 }
38 }
39 }
40