CyclicBarrier实现流水处理服务类
package com.yzu.zhang.thread.concurrent; import java.util.Map.Entry;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; /**
* 银行流水处理服务类
* @date 2016年11月21日
*/
public class BankCountService implements Runnable{ private int threadCount = 4; private Random random = new Random(); /**
* 创建4个屏障类,都处理完之后执行当前类的run方法
*/
private CyclicBarrier c = new CyclicBarrier(threadCount, this); private ExecutorService executor = Executors.newFixedThreadPool(threadCount); private ConcurrentHashMap<String, Integer> countMap = new ConcurrentHashMap<String, Integer>(); /**
* 开启线程池进行计算
*/
private void count() {
System.out.println(">>>>>开始计算>>>>>");
for (int i = 0; i < threadCount; i++) {
executor.execute(new Runnable() { @Override
public void run() {
//计算当前sheet的银行流水,模拟计算
int value = random.nextInt(10000);
try {
Thread.sleep(value);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
String threadName = Thread.currentThread().getName();
countMap.put(threadName, value);
System.out.println("["+threadName+"]计算完成:"+value+", 等待汇总..."); //银行流水计算完成,插入一个屏蔽,等待其他线程的计算
try {
c.await();
} catch (Exception e) {
e.printStackTrace();
}
} });
}
} @Override
public void run() {
int total = 0;
System.out.println("开始汇总...");
//汇总结果
for( String key : countMap.keySet() ) {
total += countMap.get(key);
} for(Entry<String,Integer> entry : countMap.entrySet()) {
//total += entry.getValue().intValue();
} //将结果输出
System.out.println("银行总流水==="+total); //关闭线程池
if (executor != null) {
executor.shutdown();
System.out.println(">>>>>计算结束>>>>>");
}
} public static void main(String[] args) {
BankCountService service = new BankCountService();
service.count();
}
}
运行结果:
>>>>>开始计算>>>>>
[pool-1-thread-1]计算完成:750, 等待汇总...
[pool-1-thread-2]计算完成:6426, 等待汇总...
[pool-1-thread-4]计算完成:6538, 等待汇总...
[pool-1-thread-3]计算完成:9430, 等待汇总...
开始汇总...
银行总流水===23144
>>>>>计算结束>>>>>
CyclicBarrier实现流水处理服务类的更多相关文章
- 【思路】-OctService服务类
OctService服务类 从以下几个方面来说吧,这次说的会有点长啊 设计: 思路: 作用: 目的: 问题: 为什么要设计这个? 它解决了什么问题? 是什么? 为什么? 怎么样? OctService ...
- Liferay7 BPM门户开发之34: liferay7对外服务类生成(RestService Get Url)
在liferay7中开发不依赖Service Builder的对外服务类,非常简洁,只需要2点注解: 在类的前部定义: @ApplicationPath("/PathXXX") 方 ...
- Android 服务类Service 的详细学习
http://blog.csdn.net/vipzjyno1/article/details/26004831 Android服务类Service学习四大组建 目录(?)[+] 什么是服务 服务有 ...
- Nmap扫描教程之DNS服务类
Nmap扫描教程之DNS服务类 Nmap DNS服务类 DNS(Domain Name System,域名系统)的作用就是将主机名解析为相应IP地址的过程. 通常主机域名的一般结构为:主机名.三级域名 ...
- Android 服务类Service 的具体学习
上一篇说到了通知栏Notification,提起通知栏,不得让人想到Service以及BroadcastReceive,作为android的4大组建的2个重要成员,我们没少和它们打交道.它们能够在无形 ...
- C# 利用VS自带的WSDL工具生成WebService服务类
C# 利用VS自带的WSDL工具生成WebService服务类 WebService有两种使用方式,一种是直接通过添加服务引用,另一种则是通过WSDL生成. 添加服务引用大家基本都用过,这里就不讲 ...
- 第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借助TopSelf、服务类】)
一. IIS部署 比如在MVC框架中集成了Quartz.Net定时调度,此时该调度系统会随着MVC框架被挂在IIS下,IIS会进程回收,所以大部分开发都会遇到Quartz挂在IIS下一段时间不好用. ...
- 微信小程序个人/企业开放服务类目一览表
微信小程序个人/企业开放服务类目一览表 微信小程序个人开放服务类目表 服务类目 类目分类一 类目分类二 引导描述 出行与交通 代驾 / / 生活服务 家政.丽人.摄影/扩印.婚庆服务.环保回收/废 ...
- WorldWind源码剖析系列:地形瓦片类TerrainTile和地形瓦片服务类TerrainTileService
地形瓦片类TerrainTile 用来抽象封装用户漫游中所请求的地形瓦片数据类型. 地形瓦片服务类TerrainTileService提供了从BIL(Binary Interleaved by Lin ...
随机推荐
- apache与weblogic 的整合
web服务器与应用服务器的整合中,apache与weblogic 的整合算的上最普遍也是最基础的整合了 今天配置了一下: apache 2.0 weblogic 8.1 1.将weblogic中的mo ...
- Nginx遇上Access Denied提示怎么解决
这几天在摆弄linux下面的各种服务器,对nginx非常有兴趣. 于是把phpmyadmin传上去了,先是phpmyadmin配了半天,结果配好之后发现phpmyadmin一些logo.css.js文 ...
- EditPlus详解
如何让EditPlus支持LUA教程是本文要介绍的内容,这次主要介绍一下学习Lua之前的准备工作.关于在EditPlus中实现lua的安装,具体内容来看本文详解. (1) 下载Lua安装包,最新版本是 ...
- php实现一个简单的购物网站
实现一个简单的购物网站 一.考试时间:8小时 二.开发工具:DW 三.数据库:见附件 四.需要实现的页面: Index:浏览商品页面,显示商品列表,用户可以点击“购买“. ViewCart:查看购物车 ...
- 《转》python学习(3)
转自http://www.cnblogs.com/BeginMan/archive/2013/06/03/3114974.html 1.print语句调用str()函数显示,交互式解释器调用repr( ...
- java高级---->Thread之Semaphore的使用
Semaphore也是一个线程同步的辅助类,可以维护当前访问自身的线程个数,并提供了同步机制.今天我们就学习一下Semaphore的用法. java中多线程Semaphore的使用 关于Semapho ...
- fedora/centos7防火墙FirewallD详解
1 使用 FirewallD 构建动态防火墙 1.1 “守护进程” 1.2 静态防火墙(system-config-firewall/lokkit) 1.3 使用 iptables 和 ip6tabl ...
- setTimeout/setInterval伪异步
setTimeout(function(){alert(1);}, 1000); 在使用setTimeout.setInterval的时候,会传一个时间来控制代码的执行时机.在经过了设置的时间段后,代 ...
- Android动态加载ListView中的Item
我这周上网看到动态增加listview的每一项item的布局,今天抽空自己写了一个,方便自己日后使用,这个效果还是很不错的,用到了Adapter的notifyDataSetChanged()方法,当点 ...
- Unity3D 笔记二 3D模型基础
一.3D模型基础 1.Hierarchy 显示的是界面上的游戏对象(GameObject),每个游戏对象都有.至少要有一个Camera,点击Camera就可以在Preview中看到摄像机的视角画面.每 ...