爪哇2博客
爪哇2博客

爪哇 循环屏障示例

爪哇 循环屏障示例

在本文中,我们将介绍Java中的CyclicBarrier。 循环屏障在Java 5中与其他并发utils一起引入,例如 CountDownLatch, 并发哈希图阻塞队列.

循环屏障是同步的辅助工具,它允许线程集在公共的屏障点处彼此等待。之所以称为循环的,是因为一旦释放等待的线程,它便可以重用。

例如:
让’假设您有3个线程,您希望所有线程(作为参与方的术语)都达到一个共同点,然后只有它们应该继续前进。在这种情况下,您可以将CyclicBarrier与3个参与方一起使用,一旦3个线程达到一个共同点,您就可以可以调用将实现可运行接口的事件,并释放三个线程。

CountDownLatch和CyclicBarrier之间的区别

循环屏障和CoundDownLatch之间的主要区别是CyclicBarrier可以重用。一次使用后不能使用CountDownLatch。您可以阅读更多 CountDownLatch和CyclicBarrier之间的区别。

爪哇 循环屏障示例:

步骤1: 创建一个名为"RunnableTask.java"在软件包.src.org.arpit.java2blog中

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
 
组织.Arpit.爪哇2blog;
 
进口 爪哇.实用程序.同时.BrokenBarrierException;
进口 爪哇.实用程序.同时.循环屏障;
 
上市 可运行Task 实施 可运行{
 
    循环屏障 循环屏障;
     睡觉时间;
 
    可运行Task(循环屏障 循环屏障, 睡觉时间){
        这个.循环屏障=循环屏障;
        这个.睡觉时间=睡觉时间;
    }
 
    @覆写
    上市 虚空 () {
 
        尝试 {
            线.睡觉(睡觉时间);
            系统..打印(线.currentThread().getName() +
                    “正在等待”+(循环屏障.getParties()-循环屏障.getNumberWaiting()-1)+
                    “其他线程达到共同的障碍点”);
            / *
             * when  3个参与者将调用await()方法(即公共障碍点)
            * CyclicBarrrierEvent将被触发,所有等待线程将被释放。
             */
            循环屏障.等待();
        } 抓住 (InterruptedException e) {
            e.printStackTrace();
        } 抓住 (BrokenBarrierException e) {
            e.printStackTrace();
        }          
 
        系统..打印(“作为”+循环屏障.getParties()+ “线程已达到共同的障碍”
                + 线.currentThread().getName() +
                “已被释放”);
    }
 
}
 

这是一个Runnable任务,将由每个线程执行。
第2步: 创建一个名为"CyclicBarrierFinishEvent.java"在软件包.src.org.arpit.java2blog中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
组织.Arpit.爪哇2blog;
 
上市 循环屏障FinishEvent 实施 可运行{
 
    上市 虚空 () {
 
           系统..打印(“由于3个线程已达到共同的障碍点”
                        + “,已触发CyclicBarrrierFinishEvent”);
           系统..打印(“您可以更新共享变量(如果有)”);
    }
 
}
 

当3个参与方(由CyclicBarrier对象初始化)到达一个公共障碍点时,将调用CyclicBarrierFinishEvent。
第三步: 创建一个名为"CyclicBarrierMain.java"在软件包.src.org.arpit.java2blog中

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
 
组织.Arpit.爪哇2blog;
 
进口 爪哇.实用程序.同时.循环屏障;
 
/ ** @作者Arpit Mandliya * /
上市 循环屏障Main {
    上市 静态的 虚空 主要([] args) {
        / *
        *当所有3个参与方都创建有3个参与方的CountDownLatch
        *将达到公共障碍点CyclicBarrrierFinishEvent将为
         * triggered
         */
        循环屏障 循环屏障= 循环屏障(3 , 循环屏障FinishEvent());
 
        可运行Task 跑nableTask1= 可运行Task(循环屏障,1000);
        可运行Task 跑nableTask2= 可运行Task(循环屏障,2000);
        可运行Task 跑nableTask3= 可运行Task(循环屏障,3000);
 
        //创建并启动3个线程
         线(跑nableTask1,“线程1”).开始();
         线(跑nableTask2,“线程2”).开始();
         线(跑nableTask3,“线程3”).开始();
 
        / *
        *我们正在使用以下线程重用循环屏障
         * */
        可运行Task 跑nableTask4= 可运行Task(循环屏障,4000);
        可运行Task 跑nableTask5= 可运行Task(循环屏障,5000);
        可运行Task 跑nableTask6= 可运行Task(循环屏障,6000);
 
        //创建并启动另外3个线程
         线(跑nableTask4,“线程4”).开始();
         线(跑nableTask5,“线程5”).开始();
         线(跑nableTask6,“线程6”).开始();
 
    }
 
}
 

让’s运行程序,那么我们将了解输出:

线程1正在等待其他2个线程到达公共障碍点
线程2正在等待其他1个线程到达公共屏障点
线程3正在等待其他0个线程到达公共屏障点
当3个线程达到公共障碍点时,已触发CyclicBarrrierFinishEvent
您可以更新共享变量(如果有)
随着3个线程达到共同的障碍点,Thread-3已发布
当3个线程达到共同的障碍点时,线程1已发布
当3个线程达到共同的障碍点时,线程2已发布
线程4正在等待其他2个线程到达公共障碍点
线程5正在等待其他1个线程到达公共障碍点
线程6正在等待其他0个线程到达公共屏障点
当3个线程达到公共障碍点时,已触发CyclicBarrrierFinishEvent
您可以更新共享变量(如果有)
当3个线程达到共同的障碍时,线程6已发布
当3个线程达到共同的障碍点时,Thread-4已发布
当3个线程达到共同的障碍点时,Thread-5已发布

下图将使您更好地理解输出。

循环屏障输出

那’关于Java 循环屏障示例的全部内容。


导入联系人

您可能还喜欢:

分享这个

作者

关注作者

相关文章

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

订阅我们的新闻

获取质量教程到您的收件箱。现在订阅。


让’s be Friends

©2020 爪哇2博客