java-并发工具类

CountDownLatch

  • CountDownLatch是一种java.util.concurrent包下一个并发工具类,它允许一个或多个线程等待直到在其他线程中一组操作执行完成。
  • 可以控制线程的执行顺序

例子:学校操场的跑道上8位选手首先进行1000米赛跑,跑完裁判清空跑道进行跨栏比赛。

结果:

总结

  • CountDownLatch end = new CountDownLatch(N); //构造对象时候 需要传入参数N
  • end.await()  能够阻塞线程 直到调用N次end.countDown() 方法才释放线程
  • end.countDown() 可以在多个线程中调用  计算调用次数是所有线程调用次数的总和

 CyclicBarrier-栅栏

  • 栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生。栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行。闭锁用于等待事件,而栅栏用于等待其他线程。
  • CyclicBarrier可以使一定数量的线程反复地在栅栏位置处汇集。当线程到达栅栏位置时将调用await方法,这个方法将阻塞直到所有线程都到达栅栏位置。如果所有线程都到达栅栏位置,那么栅栏将打开,此时所有的线程都将被释放,而栅栏将被重置以便下次使用。

CyclicBarrier跟countDownLatch的区别

  • CountDownLatch一般用于某个线程等待若干个其他线程执行完任务之后,它才执行;不可重复使用
  • CyclicBarrier一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行;可重用的

例子:学校操场的跑道上8位选手进行1000米赛跑,只有当8位选手都到起跑线上,才能进行比赛

 结果:

   另一种构造函数:

 到达某种状态时,执行Runnable的run()。

Semaphore--信号量

  • 控制并发数量
  • 常用于限制可以访问某些资源的线程数量,例如通过 Semaphore 限流
  • Semaphore 是 synchronized 的加强版,作用是控制线程的并发数量。就这一点而言,单纯的synchronized 关键字是实现不了的

构造函数

   fair表示公平实现和非公平实现

 结果:

 因为设置的信号量控制数为5,所以当代码执行到Thread-3开始执行之后休眠5秒,再去执行其他的线程。

 Exchanger

  • 用于交换数据
  • 它提供一个同步点,在这个同步点两个线程可以交换彼此的数据。这两个线程通过exchange方法交换数据, 如果第一个线程先执行exchange方法,它会一直等待第二个线程也执行exchange,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方。因此使用Exchanger的重点是成对的线程使用exchange()方法,当有一对线程达到了同步点,就会进行交换数据。因此该工具类的线程对象是【成对】的。

 结果:

源代码地址:https://github.com/woxbwo/is-concurrent

 

猜你喜欢

转载自www.cnblogs.com/woxbwo/p/11462732.html