24.循环栅栏 CyclicBarrier

import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * 循环栅栏 CyclicBarrier
 * 可以反复使用的计数器
 * 如:计数器设置为10,凑齐第一批10个线程后,计数器就会归零,然后接着凑齐下一批10个线程
 *
 *  public CyclicBarrier(int parties, Runnable barrierAction) //计数总数,线程总数
 */
public class CyclicBarrierDemo {
    public static class Soldier implements Runnable{
        private String soldier;
        private final CyclicBarrier cyclicBarrier;
        Soldier(String soldierName, CyclicBarrier cyclicBarrier) {
            this.soldier = soldierName;
            this.cyclicBarrier = cyclicBarrier;
        }
        @Override
        public void run() {
            try {
                //等待任务安排
                System.out.println("开始了");
                cyclicBarrier.await();
                doWork();
                //等待任务完成
                cyclicBarrier.await();
            } catch (InterruptedException | BrokenBarrierException e) {
                //InterruptedException线程被中断
                //BrokenBarrierException:表示当前的cyclicBarrier已经破损了,避免其他线程进行永久的,无所谓的等待
                e.printStackTrace();
            }
        }

        void doWork() {
            try {
                Thread.sleep(Math.abs(new Random().nextInt()%10000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(soldier+":任务完成");
        }
    }
    public static class BarrierRun implements Runnable{
        boolean  flag;
        int N;

        public BarrierRun(boolean flag, int n) {
            this.flag = flag;
            N = n;
        }

        @Override
        public void run() {
            if (flag){
                System.out.println(N+"个任务已完成!");
            }else {
                System.out.println("安排"+N+"个任务!");
                flag = true;
            }
        }
    }
    public static void main(String[] args){
        final int N = 10;
        Thread[] allSoldier = new Thread[10];
        boolean flag = false;
        CyclicBarrier cyclic = new CyclicBarrier(N, new BarrierRun(flag, N));
        System.out.println("安排任务...");
        for (int i = 0; i < N; i++) {
            System.out.println("任务"+i+"安排");
            allSoldier[i] = new Thread(new Soldier("任务"+i,cyclic));
            allSoldier[i].start();
        }
    }
    //每运行完N个次数的任务就会执行BarrierRun任务

    //安排任务...
    //任务0安排
    //任务1安排
    //开始了
    //开始了
    //任务2安排
    //开始了
    //任务3安排
    //开始了
    //任务4安排
    //任务5安排
    //开始了
    //任务6安排
    //开始了
    //任务7安排
    //开始了
    //任务8安排
    //开始了
    //开始了
    //任务9安排
    //开始了
    //安排10个任务!
    //任务6:任务完成
    //任务3:任务完成
    //任务9:任务完成
    //任务5:任务完成
    //任务4:任务完成
    //任务0:任务完成
    //任务8:任务完成
    //任务7:任务完成
    //任务2:任务完成
    //任务1:任务完成
    //10个任务已完成!
}

原文地址:https://www.cnblogs.com/fly-book/p/11403481.html

时间: 2024-10-07 09:37:33

24.循环栅栏 CyclicBarrier的相关文章

多线程之倒计时器CountDownLatch和循环栅栏CyclicBarrier

1.倒计时器CountDownLatch CountDownLatch是一个多线程控制工具类.通常用来控制线程等待,它可以让一个线程一直等待知道计时结束才开始执行 构造函数: public CountDownLatch(int count) //count 计数个数 例如:在主线程中启动10个子线程去数据库中获取分页数据,需要等到所有线程数据都返回之后统一做统计处理 public class CountDownLatchDemo implements Runnable{ private stat

循环栅栏:CyclicBarrier(司令要求任务) 读书笔记

可以理解为循环栅栏,栅栏就是一种障碍物.假如我们将计数器设置为10,那么凑齐第一批10个线程后,计数器就会归零,然后接着凑齐下一批10个线程,这就是循环栅栏的含义. 构造器: public CyclicBarrier(int parties, Runnable barrierAction) parties:计数总数,也就是参与的线程总数. barrierAction 当计数器一次完成计数后,系统会执行的动作 下面代码展示了 司令要求10个士兵去完成任务,先集合10个然后去一起完成任务,等全部完成

3.1.6 循环栅栏:CyclicBarrier

package 第三章.循环栅栏CyclicBarrier; import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier; /** * Created by zzq on 2018/1/24. */public class CyclicBarrierTeST implements Runnable{ static CyclicBarrier cyclicBarrier=n

栅栏——CyclicBarrier

栅栏CyclicBarrier和闭锁CountDownLatch类似,可以说它们都是用来计数,都能阻塞一组线程知道某个事件发生.不同的是闭锁用于等待事件,而栅栏用于等待其他线程. 在前一篇<CountDownLatch--闭锁的实现之一>中提到,在CountDownLatch里有一个计数器,一个线程完成一个任务后调用countdown方法使其计数器-1,等待线程则在执行方法前调用await方法,当CountDownLatch计数器减至0时将会放行的阻塞等待线程.那么CyclicBarrier所

并发编程——闭锁CountDownLatch 与 栅栏CyclicBarrier

Java并发编程实践 目录 并发编程—— ConcurrentHashMap 并发编程—— 阻塞队列和生产者-消费者模式 并发编程——闭锁CountDownLatch 与 栅栏CyclicBarrier 概述 第1部分 闭锁 第2部分 栅栏 参考 第1部分 闭锁 闭锁是一种同步工具类,可以延迟线程的进度直到其到达终止状态.闭锁的作用相当于一扇门:在闭锁到达结束状态之前,这扇门一直是关闭的,并且没有任何线程能通过,当到达结束状态时,这扇门会打开并允许所有的线程通过.当闭锁到达结束状态后,将不会再改

闭锁CountDownLatch和栅栏CyclicBarrier之异同举例

CountDownLatch和CyclicBarrier的主要联系和区别如下: 1.闭锁CountDownLatch做减计数,而栅栏CyclicBarrier则是加计数. 2.CountDownLatch是一次性的,CyclicBarrier可以重用. 3.CountDownLatch强调一个线程等多个线程完成某件事情.CyclicBarrier是多个线程互等,等大家都完成. 4.鉴于上面的描述,CyclicBarrier在一些场景中可以替代CountDownLatch实现类似的功能. 另外,值

同步工具类-----循环栅栏:CyclicBarrier

import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.TimeUnit; public class TestCyclicBarrier { public static class Soldier implements Runnable { private String soldier; private fi

栅栏 CyclicBarrier

java.util.concurrent.CyclicBarrier 类是一种同步机制,它能够对处理一些算法的线程实现同步.换句话讲,它就是一个所有线程必须等待的一个栅栏,直到所有线程都到达这里,然后所有线程才可以继续做其他事情. 1 package cyclicbarrier; 2 3 import java.util.concurrent.BrokenBarrierException; 4 import java.util.concurrent.ConcurrentHashMap; 5 im

回环栅栏CyclicBarrier

通过它可以实现让一组线程等待至某个状态之后再全部同时执行.叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用.我们暂且把这个状态就叫做barrier,当调用await()方法之后,线程就处于barrier了. CyclicBarrier类位于java.util.concurrent包下,CyclicBarrier提供2个构造器: ? 1 2 3 4 5 public CyclicBarrier(int parties, Runnable barrierAction)