当前位置:   article > 正文

juc下常用的五个高并发工具

高并发工具

1、CountDownLatch:同步计数器
CountDownLatch的count计数>0时,await()会造成线程阻塞,当使用countDown()让count-- == 0时,线程结束阻塞。 如果想让其他线程执行完指定程序,其他所有程序都执行结束后再执行,这时可以用CountDownLatch,但计数无法被重置,如果需要重置计数,请考虑使用 CyclicBarrier。下面demo演示了当所有线程执行完任务后。

public class CountDownLatchDemo implements Runnable {

   private CountDownLatch begin;
   //观察end的count为0时,会使当前线程退出阻塞
   private CountDownLatch end;
   //用来模拟子线程执行的任务
   private int index = 10;

   public CountDownLatchDemo(CountDownLatch begin, CountDownLatch end) {
       this.begin = begin;
       this.end = end;
   }

   //这里要使用同步synchronized
   synchronized  public void run(){
       try {
           begin.await();
           index--;
           System.out.println(Thread.currentThread().getName() + ":执行完任务了,  index: " + index);
       } catch (Exception e) {
           e.printStackTrace();
       } finally {
           end.countDown();
       }
   }

   public static void main(String[] args) throws InterruptedException {
       CountDownLatch begin = new CountDownLatch(1);
       CountDownLatch end = new CountDownLatch(10);
       CountDownLatchDemo cdlDemo = new CountDownLatchDemo(begin, end);
       System.out.println("所有线程开始执行任务....");
       for (int i = 0; i < 10; i++) {
           new Thread(cdlDemo).start();
       }
       //开始让所有线程工作
       begin.countDown();
       //
       end.await();
       System.out.println("所有线程完成任务,可以开始做其它想做的事 了....");
   }
}
  • 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

2、CyclicBarrier: 线程屏障的功能
可以协同多个线程,让多个线程在这个屏障前等到,直到所有线程都到达了这个屏障时,再一起执行后面的操作。下面demo创建11个线程,前面每一个线程使用await()都会使当前线程阻塞,直到最后一个线程使用await()会使11个线程全部退出阻塞。

public class CyclicBarrierDemo implements Runnable {

    private CyclicBarrier cyclicBarrier;
    private int index ;

    public CyclicBarrierDemo(CyclicBarrier cyclicBarrier, int index) {
        this.cyclicBarrier = cyclicBarrier;
        this.index = index;
    }

    public void run() {
        try {
            System.out.println("index: " + index);
            index--;
            cyclicBarrier.await();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(11);
        for (int i = 0; i < 10; i++) {
            new Thread(new CyclicBarrierDemo(cyclicBarrier, i)).start();
        }
        cyclicBarrier.await();
        System.out.println("全部到达屏障.
  • 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
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/828775
推荐阅读
相关标签
  

闽ICP备14008679号