学习了解CyclicBarrier

CyclicBarrier我的理解就是一个线程等待器,用途就是将注册了这个barrier的线程卡在同一个位置,直到注册这个barrier的所有线程都完成之后,继续执行。
下面是一个学习过程中采用的示例,计算每个学生分别的成绩,然后统一汇总计算全班成绩
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package cyclic;
 
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
 
public class CyclicBarrierDemo {
    public static void main(String[] args) {
        List<String> students = Arrays.asList("Tom","Bill","Dick","Marry","Lily","Harry");
        StudentCalc calc = new StudentCalc();
        CyclicBarrier cyclicBarrier = new CyclicBarrier(students.size(),new TotalScore(calc));//所有注册cyclicBarrier的线程完成后才会执行TotalScore线程
        students.forEach(x-> new Thread(new StudentScore(cyclicBarrier,calc,x)).start());
        System.out.println("我在主线程");//对后续无影响
    }
}
 
class TotalScore implements Runnable{
    private StudentCalc studentCalc;
 
    TotalScore(StudentCalc studentCalc) {
        this.studentCalc = studentCalc;
    }
 
 
    @Override
    public void run() {
        studentCalc.total();//总成绩 计算
    }
}
 
 
class StudentScore implements Runnable{
 
    private CyclicBarrier barrier;
    private StudentCalc studentCalc;
    private String studentName;
 
    public StudentScore(CyclicBarrier barrier, StudentCalc studentCalc, String studentName) {
        this.barrier = barrier;
        this.studentCalc = studentCalc;
        this.studentName = studentName;
    }
 
    @Override
    public void run() {
        studentCalc.student(studentName);
         
        try {
            this.barrier.await();//计算完成后等待其他线程
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (BrokenBarrierException e) {
            e.printStackTrace();
        }
    }
}
 
/**
 * 计算类
 */
class StudentCalc {
    /**
     * 全部成绩计算完成后,调用汇总
     */
    public void total(){
        System.out.println("全体学生成绩汇总计算");
 
    }
 
    /**
     * 计算每个学生自己成绩,为了模拟每个学生计算时间不同,使用Thread.sleep区分
     * @param student
     */
    public void student(String student){
        try {
            Thread.sleep(new Random().nextInt(2000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("计算" + student + "成绩");
    }
}

  示例很简单,具体CyclicBarrier是如何实现的,后面在慢慢研究。

输出结果不固定如下所示:

我在主线程
计算Lily成绩
计算Bill成绩
计算Tom成绩
计算Dick成绩
计算Marry成绩
计算Harry成绩
全体学生成绩汇总计算

 

posted @   EvilTuzki  阅读(169)  评论(0编辑  收藏  举报
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示