zoukankan      html  css  js  c++  java
  • CyclicBarrier(栅栏)的用法详解及与countDownLatch用法区别

    CyclicBarrier适用于这样的情况:你希望创建一组任务,它们并行的执行工作,然后在进行下一步步骤之前等待,直至所有任务都完成,它使得所有的并行任务都将在删栏出列队,因此可以一致的向前移动。

    当调用await时  指定的任务运行完后会awiat  直到最后一个线程运行完毕,才继续执行下一步动作

    用法和countDownLatch差不多  countDownLatch只触发一次,而CyclicBarrier可以多次重用

    
    
    public class CyclicBarrierSimple {

    public static void main(String[] args) {
    int N = 4;
    /**
    * partie:在达到删栏时 指定的线程数被阻塞等待...
    * barrierAction:到达删栏时 执行的线程任务
    */
    CyclicBarrier barrier = new CyclicBarrier(N,new ThreadRunner());
    for (int i = 0; i < N; i++) {
    new Writer(barrier).start();
    }
    try {
    Thread.sleep(25000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    System.out.println("CyclicBarrier重用");

    for(int i=0;i<N;i++) {
    new Writer(barrier).start();
    }
    }

    static class ThreadRunner implements Runnable{


    @Override
    public void run() {
    System.out.println("大家统一到达删栏后执行...");
    }
    }

    static class Writer extends Thread {


    private CyclicBarrier cyclicBarrier;

    public Writer(CyclicBarrier barrier) {
    cyclicBarrier = barrier;
    }

    @Override
    public void run() {
    System.out.println(System.currentTimeMillis() + "线程" + Thread.currentThread().getName() + " 正在写入数据...");
    try {
    //以睡眠来模拟写入数据库操作
    TimeUnit.MILLISECONDS.sleep(1000);
    System.out.println("线程" + Thread.currentThread().getName() + "写入数据完毕,等待其他线程写入完毕");
    int index = cyclicBarrier.await();
    System.out.println("越过栅栏后的索引" + index);
    } catch (InterruptedException | BrokenBarrierException e) {
    e.printStackTrace();
    }
    System.out.println(Thread.currentThread().getName() + "所有线程写入完毕,继续处理其他任务");

    }
    }
    }
     

    1553691604894线程Thread-1 正在写入数据...
    1553691604894线程Thread-3 正在写入数据...
    1553691604894线程Thread-2 正在写入数据...
    1553691604894线程Thread-0 正在写入数据...
    线程Thread-1写入数据完毕,等待其他线程写入完毕
    线程Thread-0写入数据完毕,等待其他线程写入完毕
    线程Thread-2写入数据完毕,等待其他线程写入完毕
    线程Thread-3写入数据完毕,等待其他线程写入完毕
    大家统一到达删栏后执行...
    越过栅栏后的索引0
    越过栅栏后的索引1
    越过栅栏后的索引3
    Thread-1所有线程写入完毕,继续处理其他任务
    越过栅栏后的索引2
    Thread-0所有线程写入完毕,继续处理其他任务
    Thread-2所有线程写入完毕,继续处理其他任务
    Thread-3所有线程写入完毕,继续处理其他任务
    CyclicBarrier重用
    1553691629896线程Thread-4 正在写入数据...
    1553691629896线程Thread-5 正在写入数据...
    1553691629896线程Thread-6 正在写入数据...
    1553691629896线程Thread-7 正在写入数据...
    线程Thread-5写入数据完毕,等待其他线程写入完毕
    线程Thread-6写入数据完毕,等待其他线程写入完毕
    线程Thread-4写入数据完毕,等待其他线程写入完毕
    线程Thread-7写入数据完毕,等待其他线程写入完毕
    大家统一到达删栏后执行...
    越过栅栏后的索引0
    越过栅栏后的索引3
    Thread-5所有线程写入完毕,继续处理其他任务
    越过栅栏后的索引1
    Thread-4所有线程写入完毕,继续处理其他任务
    越过栅栏后的索引2
    Thread-6所有线程写入完毕,继续处理其他任务
    Thread-7所有线程写入完毕,继续处理其他任务

  • 相关阅读:
    python K-means工具包初解
    Struts2学习笔记1
    北邮iptv用WindowsMediaplayer打不开的解决的方法
    数据挖掘十大经典算法(9) 朴素贝叶斯分类器 Naive Bayes
    Java中Queue类实现
    LinkedList
    android 自定义 radiobutton 文字颜色随选中状态而改变
    Android自定义radiobutton(文字靠左,选框靠右)
    Android进阶2之APK方式换肤
    Android APK方式换肤实现原理
  • 原文地址:https://www.cnblogs.com/zhangfengshi/p/10610727.html
Copyright © 2011-2022 走看看