• 并发新构件之CyclicBarrier


    CyclicBarrier:叫做循环栅栏,名字挺好听的。JDK描述:允许一组线程全部等待彼此达到共同屏障点的同步辅助。 循环阻塞在涉及固定大小的线程方的程序中很有用,这些线程必须偶尔等待彼此。 屏障被称为循环 ,因为它可以在等待的线程被释放之后重新使用。

    作用是好比我们一行人要去做地铁,每个人就是一个线程,来的人有早有晚(仿佛多个线程执行情况不一样),但是必须都到齐车站后,才能上车,少一个都不行,先到的人等待(await()),最后一个人await()之后发现人数齐了,所有人上车(所有线程再往下执行)。

    构造器: CyclicBarrier(N);这个栅栏负责N个线程协作
    await():如果当前线程不是最后一个线程,那么它被禁用以进行线程调度,并且处于休眠状态,直到发生下列事情之一:
    • 要么最后一个线程到达; 
    • 要么超过指定的超时  
    • 要么一些其他线程调用当前线程interrupt  
    • 要么一些其他线程在等待屏障时超时 
    • 其他一些线程在这个障碍上调用reset() 。
    package com.houjun.current.newClassBank;
    
    import java.util.concurrent.*;
    
    /**
     * @Author: HouJun
     * @Date: 2019/10/17 13:43
     * @Description: 循环栅栏
     * @version: 1.0
     */
    public class CyclicBarrierTest {
        public static void main(String[] args) {
            ExecutorService executorService = Executors.newCachedThreadPool();
            CyclicBarrier cyclicBarrier = new CyclicBarrier(2);
            for (int i = 0; i < 5; i++) {
                executorService.execute(new Way2(cyclicBarrier));
            }
        }
    }
    
    class Way2 implements Runnable {
        private CyclicBarrier cyclicBarrier;
    
          Way2(CyclicBarrier cyclicBarrier) {
            this.cyclicBarrier = cyclicBarrier;
        }
    
        @Override
        public void run() {
            try {
                System.out.println("线程"+this+"到达");
                cyclicBarrier.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
            System.out.println("全部到达北京西,一起出发吧");
        }
    }
  • 相关阅读:
    ES6-11学习笔记--正则表达式的扩展
    ES6-11学习笔记--字符串的扩展
    ES6-11学习笔记--Map
    ES6-11学习笔记--Set
    ES6-11学习笔记--Symbol
    final
    MySQL
    爬虫1
    laravel
    HTML学习
  • 原文地址:https://www.cnblogs.com/houj/p/11691689.html
Copyright © 2020-2023  润新知