• cyclicBarrier(篱笆)


    CyclicBarrier测试案例一:

    package com.dwz.utils;
    
    import java.util.concurrent.BrokenBarrierException;
    import java.util.concurrent.CyclicBarrier;
    import java.util.concurrent.TimeUnit;
    
    public class CyclicBarrierExample1 {
        public static void main(String[] args) {
            CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
            
            new Thread() {
                public void run() {
                    try {
                        TimeUnit.SECONDS.sleep(20);
                        System.out.println("t1 finished.");
                        cyclicBarrier.await();
                        System.out.println("t1 The other thread finished too.");
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                };
            }.start();
            
            new Thread() {
                public void run() {
                    try {
                        TimeUnit.SECONDS.sleep(10);
                        System.out.println("t2 finished.");
                        cyclicBarrier.await();
                        System.out.println("t2 The other thread finished too.");
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                };
            }.start();
            
            try {
                cyclicBarrier.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
            System.out.println("all of thread finished.");
        }
    }

    结果:

    t2 finished.
    t1 finished.
    all of thread finished.
    t1 The other thread finished too.
    t2 The other thread finished too.

    测试案例二:

    篱笆(cyclicBarrier)被破坏的时候给个回调通知

    package com.dwz.utils;
    
    import java.util.concurrent.CyclicBarrier;
    import java.util.concurrent.TimeUnit;
    
    public class CyclicBarrierExample2 {
        public static void main(String[] args) {
            // 篱笆(cyclicBarrier)被破坏的时候给个回调通知
            CyclicBarrier cyclicBarrier = new CyclicBarrier(2, new Runnable() {
                @Override
                public void run() {
                    System.out.println("all of thread finished.");
                }
            });
            
            new Thread() {
                public void run() {
                    try {
                        TimeUnit.SECONDS.sleep(20);
                        System.out.println("t1 finished.");
                        cyclicBarrier.await();
                        System.out.println("t1 The other thread finished too.");
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                };
            }.start();
            
            new Thread() {
                public void run() {
                    try {
                        TimeUnit.SECONDS.sleep(10);
                        System.out.println("t2 finished.");
                        cyclicBarrier.await();
                        System.out.println("t2 The other thread finished too.");
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                };
            }.start();
        }
    }

    结果:

    t2 finished.
    t1 finished.
    all of thread finished.
    t1 The other thread finished too.
    t2 The other thread finished too.

    测试案例三:

    cyclicBarrier.getNumberWaiting()不为0时会出现BrokenBarrierException

    package com.dwz.utils;
    
    import java.util.concurrent.BrokenBarrierException;
    import java.util.concurrent.CyclicBarrier;
    import java.util.concurrent.TimeUnit;
    
    public class CyclicBarrierExample3 {
        public static void main(String[] args) throws InterruptedException {
            final CyclicBarrier cyclicBarrier = new CyclicBarrier(2);
            
            new Thread() {
                public void run() {
                    try {
                        TimeUnit.SECONDS.sleep(5);
                        cyclicBarrier.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (BrokenBarrierException e) {
                        e.printStackTrace();
                    }
                };
            }.start();
            
            new Thread() {
                public void run() {
                    try {
                        cyclicBarrier.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (BrokenBarrierException e) {
                        e.printStackTrace();
                    }
                };
            }.start();
            
            TimeUnit.SECONDS.sleep(2);
            cyclicBarrier.reset();
        }
    }

    测试结果:

    java.util.concurrent.BrokenBarrierException
        at java.util.concurrent.CyclicBarrier.dowait(CyclicBarrier.java:250)
        at java.util.concurrent.CyclicBarrier.await(CyclicBarrier.java:362)
        at com.dwz.utils.CyclicBarrierExample3$2.run(CyclicBarrierExample3.java:27)

    测试案例四:

    cyclicBarrier.reset()用法

    package com.dwz.utils;
    
    import java.util.concurrent.BrokenBarrierException;
    import java.util.concurrent.CyclicBarrier;
    import java.util.concurrent.TimeUnit;
    
    public class CyclicBarrierExample4 {
        public static void main(String[] args) throws InterruptedException {
            final CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
            
            new Thread() {
                public void run() {
                    try {
                        TimeUnit.SECONDS.sleep(5);
                        cyclicBarrier.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (BrokenBarrierException e) {
                        e.printStackTrace();
                    }
                };
            }.start();
            
            new Thread() {
                public void run() {
                    try {
                        cyclicBarrier.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (BrokenBarrierException e) {
                        e.printStackTrace();
                    }
                };
            }.start();
            
            new Thread() {
                public void run() {
                    try {
                        cyclicBarrier.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (BrokenBarrierException e) {
                        e.printStackTrace();
                    }
                };
            }.start();
            
            TimeUnit.SECONDS.sleep(4);
            System.out.println(cyclicBarrier.getNumberWaiting());
            System.out.println(cyclicBarrier.getParties());
            
            TimeUnit.SECONDS.sleep(2);
            System.out.println("=================");
            cyclicBarrier.reset();
            System.out.println(cyclicBarrier.getNumberWaiting());
            System.out.println(cyclicBarrier.getParties());
        }
    }

    测试结果:

    2
    3
    =================
    0
    3

    测试案例五:

    使用CountDownLatch实现CyclicBarrier的回调通知效果

    package com.dwz.utils;
    
    import java.util.concurrent.CountDownLatch;
    import java.util.concurrent.TimeUnit;
    /**
     * 使用CountDownLatch实现CyclicBarrier的回调通知效果
     * 
     * CountDownLatch 与 CyclicBarrier的区别
       1.CountDownLatch不能reset,而CyclicBarrier是可以循环使用的
       2.CountDownLatch的工作线程之间互不关心,而CyclicBarrier的工作线程必须等到同一个共同的点才去执行某个动作
     */
    public class CyclicBarrierExample5 {
        
        static class MyCountDownLatch extends CountDownLatch {
            private final Runnable runnable;
            public MyCountDownLatch(int count, Runnable runnable) {
                super(count);
                this.runnable = runnable;
            }
            
            @Override
            public void countDown() {
                super.countDown();
                if(getCount() == 0) {
                    this.runnable.run();
                }
            }
        }
        
        public static void main(String[] args) {
            final MyCountDownLatch myCountDownLatch = new MyCountDownLatch(2, new Runnable() {
                @Override
                public void run() {
                    System.out.println("all of work finish done.");
                }
            });
            
            new Thread() {
                public void run() {
                    try {
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    
                    myCountDownLatch.countDown();
                    System.out.println(Thread.currentThread().getName() + " finished work.");
                };
            }.start();
            
            new Thread() {
                public void run() {
                    try {
                        TimeUnit.SECONDS.sleep(2);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    
                    myCountDownLatch.countDown();
                    System.out.println(Thread.currentThread().getName() + " finished work.");
                };
            }.start();
        }
    }
  • 相关阅读:
    etherlime-1-Quick Start
    etherlime-4-Etherlime CLI
    Sequelize-nodejs-2-basic usage
    Sequelize-nodejs-6-Instances
    Sequelize-nodejs-5-Querying
    Sequelize-nodejs-4-Model usage
    Sequelize-nodejs-3-model definition
    eclipse快捷键大全
    java第一课
    java程序员认证考试题库
  • 原文地址:https://www.cnblogs.com/zheaven/p/13292416.html
Copyright © 2020-2023  润新知