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号车离开了车库!

 

 

posted @ 2022-02-27 15:41  鸭猪是的念来过倒  阅读(13)  评论(0编辑  收藏  举报