必威体育Betway必威体育官网
当前位置:首页 > IT技术

CyclicBarrier实例一

时间:2019-10-25 05:43:36来源:IT技术作者:seo实验室小编阅读:87次「手机版」
 

cyclicbarrier

import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierTest2 {
    static CyclicBarrier c = new CyclicBarrier(2, new A());

    public static void main(String[] args) {
        //另外的子线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println(Thread.currentThread().getName() + ",19");
                    System.out.println(1);
                    c.await();
                } catch (Exception e) {
                }

            }
        }).start();

        //main线程
        try {
            System.out.println(Thread.currentThread().getName() + ",28");
            System.out.println(2);
            c.await();
        } catch (Exception e) {
        }

    }

    //所有线程都到达时,最后一个到达的线程触发Runnable运行
    static class A implements Runnable {
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName() + ",run");
            System.out.println(3);
        }
    }
}

输出:

main,28

2

Thread-0,19

1

Thread-0,run

3

实例二:

CyclicBarrier可以用于多线程计算数据,最后合并计算结果的场景。例如,用一个excel

存了用户所有银行流水,每个Sheet保存一个账户近一年的每笔银行流水,现在需要统计用户

的日均银行流水,先用多线程处理每个sheet里的银行流水,都执行完之后,得到每个sheet的日

均银行流水,最后,再用barrierAction用这些线程的计算结果,计算出整个Excel的日均银行流

水。

import java.util.Map.Entry;
import java.util.concurrent.brokenBarrierException;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

/**
 * 银行流水处理服务类
 *
 * @authorftf
 */
public class BankWaterService implements Runnable {
    /**
     * 创建4个屏障,处理完之后执行当前类的run方法
     */
    private CyclicBarrier c = new CyclicBarrier(4, this);
    /**
     * 假设只有4个sheet,所以只启动4个线程
     */
    private Executor.executor = Executors.newFixedThreadPool(4);
    /**
     * 保存每个sheet计算出的银流结果
     */
    private ConcurrentHashMap<String, integer> sheetBankWaterCount = new
            ConcurrentHashMap<String, Integer>();

    private void count() {
        for (int i = 0; i < 4; i++) {

/*            executor.execute(new Runnable() {
                @Override
                public void run() {
                    //计算当前sheet的银流数据,计算代码省略
                    sheetBankWaterCount
                            .put(Thread.currentThread().getName(), 1);
                    System.out.println(Thread.currentThread().getName() + ",count");
                    //银流计算完成,插入一个屏障
                    try {
                        c.await();
                    } catch (InterruptedException |
                            BrokenBarrierException e) {
                        e.printstacktrace();
                    }
                }
            });*/

            //与上面的run同义,使用了lambda
            executor.execute(() -> {
                //计算当前sheet的银流数据,计算代码省略
                sheetBankWaterCount
                        .put(Thread.currentThread().getName(), 1);
                System.out.println(Thread.currentThread().getName() + ",count");
                //银流计算完成,插入一个屏障
                try {
                    c.await();
                } catch (InterruptedException |
                        BrokenBarrierException e) {
                    e.printStackTrace();
                }
            });
        }
    }

    //所有线程都到达时,最后一个到达的线程触发Runnable运行
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + ",run");
        int result = 0;
        //汇总每个sheet计算出的结果
        for (Entry<String, Integer> sheet : sheetBankWaterCount.entrySet()) {
            result += sheet.getValue();
        }
        //将结果输出
        sheetBankWaterCount.put("result", result);
        System.out.println(result);
    }

    public static void main(String[] args) {
        BankWaterService bankWaterCount = new BankWaterService();
        bankWaterCount.count();
    }
}

输出:

pool-1-thread-2,count

pool-1-thread-4,count

pool-1-thread-3,count

pool-1-thread-1,count

pool-1-thread-1,run

4

countdownlatch实例二

CountDownLatch实例一

CyclicBarrier实例二

CyclicBarrier实例一

CyclicBarrier和CountDownLatch区别

文章最后发布于: 2018-10-24 15:29:48

相关阅读

数据库设计(有实例)

1.概念数据库设计就是根据业务系统的具体需求,结合我们所选用的DBMS(数据库管理系统),为这个业务系统构造出最优的数据存储模型。并建

Oracle数据库名(DB_NAME)、实例名(INSTANCE_NAME)、服务名

1、数据库名即下图的全局数据库名,实例名即下图的SID 查询数据库名称SQL:SELECT NAME FROM V$DATABASE; 查询数据库当前实例名: S

thread.join,理解与实例(一)

java多线程编程join的作用是等待线程结束,这个作用可以产生很多特定的场景。 1)A线程中调用B线程的join方法,那么A线程需要等待B线

SpringMVC+Spring+HIbernate 简单增删改查实例

SpringMVC+Spring+HIbernate 简单增删改查实例 HIbernate配置mysql数据库的方

设计实例:如何以“用户”为单位的进行权限设计(一)

权限设计可以很好地对保证公司信息系统的安全。权限设计的方式主要有:以“用户”为单位、以“权限”为单位和以“用户”与“权限”

分享到:

栏目导航

推荐阅读

热门阅读