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();
    }
}
posted @ 2020-07-13 11:46  龙宇在天  阅读(196)  评论(0编辑  收藏  举报
//右侧添加目录 //增加页面点击显示24字社会主义核心价值观