zoukankan      html  css  js  c++  java
  • java并发之同步辅助类CyclicBarrier和CountDownLatch

    CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。CyclicBarrier默认的构造方法是

    CyclicBarrier(int parties),其参数表示屏障拦截的线程数量,每个线程调用await方法告诉CyclicBarrier我已经到达了屏障,然后当前线程被阻塞。

    cBarrierTest {
    
        public static void main(String[] args) {
            ExecutorService service = Executors.newCachedThreadPool();
            final CyclicBarrier cb = new CyclicBarrier(3);//约定三个人同时到达
            for (int i = 0; i < 3; i++) {
                Runnable runnable = new Runnable() {
                    public void run() {
                        try {
                            Thread.sleep((long) (Math.random() * 10000));
                            System.out.println("线程" + Thread.currentThread().getName() +
                                    "即将到达集合地点1,当前已有" + (cb.getNumberWaiting() + 1) + "个已经到达," + (cb.getNumberWaiting() == 2 ? "都到齐了,继续走啊" : "正在等候"));
                            cb.await();//三个同时线程的时候才往下走
    
                            Thread.sleep((long) (Math.random() * 10000));
                            System.out.println("线程" + Thread.currentThread().getName() +
                                    "即将到达集合地点2,当前已有" + (cb.getNumberWaiting() + 1) + "个已经到达," + (cb.getNumberWaiting() == 2 ? "都到齐了,继续走啊" : "正在等候"));
                            cb.await();
                            Thread.sleep((long) (Math.random() * 10000));
                            System.out.println("线程" + Thread.currentThread().getName() +
                                    "即将到达集合地点3,当前已有" + (cb.getNumberWaiting() + 1) + "个已经到达," + (cb.getNumberWaiting() == 2 ? "都到齐了,继续走啊" : "正在等候"));
                            cb.await();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                };
                service.execute(runnable);
            }
            service.shutdown();
        }
    }
    import java.util.concurrent.CountDownLatch;
    import java.util.concurrent.CyclicBarrier;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class CountdownLatchTest {
    
        public static void main(String[] args) {
            ExecutorService service = Executors.newCachedThreadPool();
            final CountDownLatch cdOrder = new CountDownLatch(1);
            final CountDownLatch cdAnswer = new CountDownLatch(3);
            for (int i = 0; i < 3; i++) {
                Runnable runnable = new Runnable() {
                    public void run() {
                        try {
                            System.out.println("线程" + Thread.currentThread().getName() +
                                    "正准备接受命令");
                            cdOrder.await();
                            //三个线程同时进来接受命令
                            //调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行
                            System.out.println("线程" + Thread.currentThread().getName() +
                                    "已接受命令");
    
    
                            Thread.sleep((long) (Math.random() * 10000));
                            System.out.println("线程" + Thread.currentThread().getName() +
                                    "回应命令处理结果");
                            cdAnswer.countDown();
    
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                };
                service.execute(runnable);
            }
            try {
    
                Thread.sleep((long) (Math.random() * 10000));
                System.out.println("线程" + Thread.currentThread().getName() +
                        "即将发布命令");
                cdOrder.countDown();//这里等于0之后触发了wait事件让其往下执行
                System.out.println("线程" + Thread.currentThread().getName() +
                        "已发送命令,正在等待结果");
    
    
                cdAnswer.await();
                //调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行
    
                System.out.println("线程" + Thread.currentThread().getName() +
                        "已收到所有响应结果");
            } catch (Exception e) {
                e.printStackTrace();
            }
            service.shutdown();
    
        }
    }
  • 相关阅读:
    convert data to numeric element wise , python,pandas
    return sql ret
    kettle学习
    kettle异常
    c# + python
    mysql表是否存在
    python configparser
    pandas sql execute
    apply map applymap
    sql 2008 中不能创建数据库关系图
  • 原文地址:https://www.cnblogs.com/tinya/p/8452808.html
Copyright © 2011-2022 走看看