CountDownLatch、CyclicBarrier、Semaphore
CountDownLatch概念
使线程数量达到给定值后,再进行下一步操作
1:代码案例
public class test { public static void main(String[] args) {
//传入的值,是定义的需要线程通过的数量,底层是一个计数器实现 CountDownLatch latch = new CountDownLatch(7); for (int i = 0; i < 7; i++) { new Thread(() -> { System.out.println(Thread.currentThread().getName() + "撤离了现场!"); latch.countDown(); }).start(); } //任务完成后,对最终进行处理 try { latch.await(); System.out.println(Thread.currentThread().getName() + "main处理最终任务!"); } catch (InterruptedException e) { e.printStackTrace(); } } }
Thread-0撤离了现场!
Thread-3撤离了现场!
Thread-5撤离了现场!
Thread-2撤离了现场!
Thread-1撤离了现场!
Thread-6撤离了现场!
Thread-4撤离了现场!
mainmain处理最终任务!
CyclicBarrier概念
等待多少个线程任务抵达后,才执行给定的任务
1:代码案例
public class test { public static void main(String[] args) { /** * 必须等待7个线程进入,才进行给定方法 */ CyclicBarrier barrier = new CyclicBarrier(7,()->{ System.out.println("人到齐了"); }); for (int i = 0; i < 7; i++) { final int x = i; new Thread(()->{ try { System.out.println(x + "到了"); barrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } }).start(); } } }
1到了
2到了
3到了
0到了
6到了
5到了
4到了
人到齐了
Semaphore概念
信号量,可以做资源竞争 ,也可以控制线程数量
1:代码案例
public class test { public static void main(String[] args) { /** * 信号量,可以作为一种资源竞争,也可以控制并发数量 */ Semaphore semaphore = new Semaphore(2); for (int i = 0; i < 30; i++) { final int x = i; new Thread(()->{ try { semaphore.acquire(); System.out.println(Thread.currentThread().getName() + "第"+x +"号车进入了车库!"); TimeUnit.SECONDS.sleep(1); System.out.println("第"+x +"号车离开了车库!"); } catch (InterruptedException e) { e.printStackTrace(); } finally { semaphore.release(); } },String.valueOf(i)).start(); } } }
.....
26第26号车进入了车库!
27第27号车进入了车库!
第26号车离开了车库!
第27号车离开了车库!
28第28号车进入了车库!
29第29号车进入了车库!
第28号车离开了车库!
第29号车离开了车库!