爱睡觉的程序员

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  5 随笔 :: 0 文章 :: 0 评论 :: 0 Trackbacks
     CyclicBarrier,让多线程齐步走。让多个线程到达某一个点之后,再同时往下运行。
    思考这样一个案例:两个工人从两端挖掘隧道,各自独立奋战,中间不沟通,如果两人在汇合点处碰头了,则表明隧道已经挖通。这描绘的也是在多线程编程中,两个线程独立运行,在没有线程间通信的情况下,如何解决两个线程汇集在同一原点的问题。Java提供了CyclicBarrier(关卡,也有翻译为栅栏)工具类来实现。
    代码如下:
  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         // 设置汇集数量,以及汇集完成后的任务
 8         CyclicBarrier cb = new CyclicBarrier(2, new Runnable() {
 9             public void run() {
10                 System.out.println("隧道已经打通!");
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         // 关卡
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() + "-到达汇合点");
32                 // 到达汇合点
33                 cb.await();
34             } catch (Exception e) {
35                 // 异常处理
36             }
37         }
38     }
39 }
40 
posted on 2015-02-27 11:50 polang 阅读(231) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: