concurrent-辅助类

CountDownLatch闭锁

public class XxxTest {
    /***
     * 伪代码
     */
    CountDownLatch latch = new CountDownLatch(3);//初始化一个数量为3的闭锁
    Thread t1 = new Thread();//开启三个线程
    Thread t2 = new Thread();
    Thread t3 = new Thread();
    t1: latch.countDown();//每个线程的逻辑:给闭锁数量减1
    t2: latch.countDown();
    t3: latch.countDown();
    latch.await();//同时阻塞主线程,直到每个子线程执行完毕
}

CyclicBarrier栅栏

public class CyclicBarrierTest2 {

    private static int SIZE = 5;
    private static CyclicBarrier cb;
    public static void main(String[] args) {

        cb = new CyclicBarrier(SIZE, new Runnable () {
            public void run() {
                System.out.println("CyclicBarrier's parties is: "+ cb.getParties());
            }
        });

        // 新建5个任务
        for(int i=0; i<SIZE; i++)
            new InnerThread().start();
    }

    static class InnerThread extends Thread{
        public void run() {
            try {
                System.out.println(Thread.currentThread().getName() + " wait for CyclicBarrier.");

                // 将cb的参与者数量加1
                cb.await();

                // cb的参与者数量等于5时,才继续往后执行
                System.out.println(Thread.currentThread().getName() + " continued.");
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

Semaphore信号量


public class XxxTest {
        public static void main(String[] args) {
            Semaphore sem = new Semaphore(10);//初始化一个大小为10的信号量池子
            Thread t1 = new Thread(new Runnable() {
                @Override
                public void run() {
                    try{
                        sem.acquire(5);//从信号量池子中申请5个信号量,如果池子余量不够,则等待,直到能申请到后继续往下执行
                    }catch (Exception e){
                    }finally {
                        sem.release();//释放信号量到池中
                    }
                }
            });
            Thread t2 = new Thread(new Runnable() {
                @Override
                public void run() {
                    try{
                        sem.acquire(7);//从信号量池子中申请7个信号量,如果池子余量不够,则等待,直到能申请到后继续往下执行
                    }catch (Exception e){
                    }finally {
                        sem.release();//释放信号量到池中
                    }
                }
            });
            t1.start();
            t2.start();
        }
}
posted @ 2020-03-28 14:37  平淡454  阅读(79)  评论(0编辑  收藏  举报