CyclicBarrier

来源:6-4 J.U.C之AQS-CyclicBarrier

慕妹2978617

2020-06-01

关于构造函数种的Runnable,这个是在栅栏释放前做的一些动作。但是这里我有个疑问,比如我是Android开发(swing也是一样),有主线程,当所有子线做完工作我想在主线程种做一些事情,比如更新UI,但是CyclicBarrier种的run是在子线程运行的同时不一定在哪个线程种运行 比如这个

 CyclicBarrier cyclicBarrier = new CyclicBarrier(3,new TourGuideTask());
        Executor executor = Executors.newFixedThreadPool(3);
        //登哥最大牌,到的最晚
        for (int i = 0; i < 500; i++) {

            executor.execute(new TravelTask(cyclicBarrier,"哈登",0));
            executor.execute(new TravelTask(cyclicBarrier,"保罗",0));
            executor.execute(new TravelTask(cyclicBarrier,"戈登",0));
        }

图片描述
可以看到这个run不一定是在哪个线程的。同时源码种的dowait源码种也没明显指定线程的方法,只用了个标识位index==0,标识是否执行了run.

那么2个问题:

  1. run执行的依据是什么(感觉应该是–count 最后等于0时在那个线程 这个run就在哪个线程,不知道对不对)?
  2. 根据我的需求CB能做到吗?我该怎么做?
写回答

1回答

Jimin

2020-06-01

你好,线程池里调度哪个线程去执行某个任务本身就是不一定的,最多是提高一下任务的优先级来影响一下,但也无法精确指定,线程池本身就是复用线程,这还与每个任务执行快慢等有关。
你这个有主辅线程之分时,更适合使用CountDownlatch,在主线程里等待子线程执行完再继续,你可以往这方面考虑一下。
不管怎样,不应该让任务和指定的线程绑定到一起,如果硬要保证一些顺序,可以引入同步机制,限制个别特点的线程执行时等待

0
1
慕妹2978617
非常感谢!
2020-06-01
共1条回复

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程