CyclicBarrier从小栗子来理解线程同步

我们生活中有这样一个情景,任务一是创建订单,任务二是派单,

当任务一,和任务二完成之后进行核对账款操作,

你可以抽象成任务一,和任务二完成之后通知任务三(核对账款)去完成。

如下图所示:

 这里需要注意的是,因为两个线程分别执行任务一,任务二。我们必须保证任务一,任务二同步。

假如一个快,一个慢的话分别进入队列那我们再去核账没有意义。因为这笔派单和能上一个订单。

贴上代码:

import java.util.Vector;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;




    /**
     * 订单队列
     */
    static Vector<String> pv = new Vector<>();

    /**
     * 派单队列
     */
    static  Vector<String> dv= new Vector<>();

    /**
     * 订单执行结果模拟
     */
    static AtomicInteger pvAi = new AtomicInteger(0);

    /**
     * 派单执行结果模拟
     */
    static AtomicInteger dvAi = new AtomicInteger(0);

    public static void main(String[] args) {

        Executor executor = Executors.newFixedThreadPool(1);
        CyclicBarrier cb = new CyclicBarrier(2,()->{
            executor.execute(()->check());
        });//计数器为2,每当计数器为0的时候触发依次check()

        Thread threadP = new Thread(()->{
            while (true){
                try {
                    TimeUnit.SECONDS.sleep(3);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                pv.add(getPOrder());
                try {
                    cb.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread threadD = new Thread(()->{
            while (true){
                try {
                    TimeUnit.SECONDS.sleep(4);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                dv.add(getDOrder());
                try {
                    cb.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }
        });
        threadP.start();
        threadD.start();

    }

    static String getPOrder() {
        System.out.println("订单执行》》》");
        return "POrder"+pvAi.incrementAndGet();
    }

    static String getDOrder() {
        System.out.println("派单执行》》》");
        return "DOrder"+dvAi.incrementAndGet();
    }


    static String check() {
        String p= pv.remove(0);
        String d= dv.remove(0);
        checkAccount(p,d);
        return "checkOk";
    }
    /**
     * 核对帐,需要订单结果和派单结果
     * @return
     */
    static void checkAccount(String p,String d) {
        System.out.println("核账执行》》》订单:  "+p+"  派单: "+d);
    }

以下是打印结果: 一一对应
订单执行》》》
派单执行》》》
核账执行》》》订单:  POrder1  派单: DOrder1
订单执行》》》
派单执行》》》
核账执行》》》订单:  POrder2  派单: DOrder2
订单执行》》》
派单执行》》》
核账执行》》》订单:  POrder3  派单: DOrder3
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值