闭锁CountDownLatch与栅栏CyclicBarrier
浅谈 java 信号量 Semaphore
TestSemaphore testSemaphore = new TestSemaphore();
testSemaphore.exeAction();
/**
*
*/
protected class TestSemaphore {
/**
*
*/
public TestSemaphore() {
}
/**
*
*/
public void exeAction() {
List<ClaimAccident> claimAccidents = claimAccidentDao.findClaimAccident();
if (claimAccidents == null) {
throw new AppException("timingUpdateClaimAccidentItemStatus", "timingUpdateClaimAccidentItemStatus is null");
}
//构造线程池
ExecutorService executorService = new ThreadPoolExecutor(10, 20, 3000, TimeUnit.MILLISECONDS, new LinkedBlockingDeque<>(100));
//构造信号量 10
Semaphore semaphore = new Semaphore(10);
//模拟 claimAccidents.size()个顾客等待银行 10个窗口办理业务
for (int i = 1; i <= claimAccidents.size(); i++) {
final int claimitem = i;
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
semaphore.acquire();
claimAccidents.forEach(claimAccident -> {
//queryAnlian
try {
ClaimProtection protection = claimAccident.getClaimProtection();
//query
IncOrder incOrder = Optional.ofNullable(incOrderDAO.findByOrderNo(protection.getOrderNo()))
.orElseThrow(() -> {
return new AppException("UNVALID ORDER", "unvalid order");
});
ClaimProtectionResponse response = claimProtectionOperation
.search(buildSearch(claimAccident, protection, incOrder));
log.info("INFO#timingUpdateClaimAccidentItemStatus - response: {}", apiCoreObjectMapper.writeValueAsString(response));
///result
if (!Objects.isNull(response.getBody()) && !Objects.isNull(response.getHead())) {
if (!Objects.isNull(response.getBody().getClaim())) {
ClaimProtectionClaim claim = response.getBody().getClaim();
//status
if (claim.getClaimList() != null && claim.getClaimList().size() > 0 && claim.getClaimList().get(0) != null && claim.getClaimList().get(0).getClaimStatusInfoList() != null &&
claim.getClaimList().get(0).getClaimStatusInfoList().size() > 0) {
String claimStatus = claim.getClaimList().get(0).getClaimStatusInfoList().get(0)
.getClaimStatus();
claimAccident.setClaimStatus(claimStatus);
ClaimStatus claimStatus1 = ClaimStatus.getInstance(claimStatus);
if (claimStatus1.getValue() == ClaimStatus.RECIVED.getValue()) {//已受理
claimAccident.setHzcStatus(HzcAccidentStatus.H5.getValue());
} else if (claimStatus1.getValue() == ClaimStatus.REVIEW.getValue()) { //审核中
claimAccident.setHzcStatus(HzcAccidentStatus.H6.getValue());
} else if ((claimStatus1.getValue() == ClaimStatus.DATA_UNOVER.getValue())) { //资料待补交
claimAccident.setHzcStatus(HzcAccidentStatus.H7.getValue());
} else if ((claimStatus1.getValue() == ClaimStatus.UNPAID.getValue())) { //保费未结
claimAccident.setHzcStatus(HzcAccidentStatus.H8.getValue());
} else if ((claimStatus1.getValue() == ClaimStatus.REFUND.getValue())) { //已退票
claimAccident.setHzcStatus(HzcAccidentStatus.H9.getValue());
} else if ((claimStatus1.getValue() == ClaimStatus.PAIED.getValue())) { //已支付
claimAccident.setHzcStatus(HzcAccidentStatus.H10.getValue());
} else if ((claimStatus1.getValue() == ClaimStatus.CANCELED.getValue())) { //已注销
claimAccident.setHzcStatus(HzcAccidentStatus.H11.getValue());
} else if ((claimStatus1.getValue() == ClaimStatus.REJECTED.getValue())) { //已拒赔
claimAccident.setHzcStatus(HzcAccidentStatus.H12.getValue());
} else if ((claimStatus1.getValue() == ClaimStatus.UNKOWN.getValue())) { //未知
claimAccident.setHzcStatus(HzcAccidentStatus.H99.getValue());
}
}
if (claim.getClaimList() != null && claim.getClaimList().size() > 0 && claim.getClaimList().get(0).getPayInfoList() != null && claim.getClaimList().get(0).getPayInfoList().size() > 0) {
BigDecimal payAmount = claim.getClaimList().get(0).getPayInfoList().get(0).getPayAmount();
claimAccident.setClaimPayAmount(payAmount);
}
//updatestatus
claimAccidentDao.save(claimAccident);
}
} else {
claimAccident.setErrorMessage(response.getHead().getErrorMessage());
claimAccidentDao.save(claimAccident);
}
} catch (Exception e) {
log.error("failed to get the response from #timingUpdateClaimAccidentItemStatus", e);
throw new AppException("", e.getMessage());
}
});
semaphore.release();
System.out.println("客户" + claimitem + "办理业务结束");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
executorService.submit(runnable);
}
//关闭线程池
executorService.shutdown();
}
}
- 并发编程 04——闭锁CountDownLatch 与 栅栏CyclicBarrier
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...
- 多线程之倒计时器CountDownLatch和循环栅栏CyclicBarrier
1.倒计时器CountDownLatch CountDownLatch是一个多线程控制工具类.通常用来控制线程等待,它可以让一个线程一直等待知道计时结束才开始执行 构造函数: public Count ...
- 栅栏——CyclicBarrier
栅栏CyclicBarrier和闭锁CountDownLatch类似,可以说它们都是用来计数,都能阻塞一组线程知道某个事件发生.不同的是闭锁用于等待事件,而栅栏用于等待其他线程. 在前一篇<Co ...
- 多线程-栅栏CyclicBarrier
上一篇总结了闭锁CountDownLatch,这一篇总结一下栅栏CyclicBarrier.它们两者之间的区别主要是,闭锁是等待一个事件发生,比如上一篇的田径比赛,运动员等待裁判哨声一响就可以开始跑, ...
- 十三、栅栏CyclicBarrier
一.简介 栅栏CyclicBarrier的作用就是等待一组线程都准备好了,然后执行某个任务.这与CountDownLatch很相似. 但是CyclicBarrier和CountDownLatch是有区 ...
- java高并发系列 - 第17天:JUC中的循环栅栏CyclicBarrier常见的6种使用场景及代码示例
这是java高并发系列第17篇. 本文主要内容: 介绍CyclicBarrier 6个示例介绍CyclicBarrier的使用 对比CyclicBarrier和CountDownLatch Cycli ...
- Java并发编程原理与实战二十七:循环栅栏:CyclicBarrier
昨天我们学习了倒计数功能的等待,今天我们学习的是循环栅栏:CyclicBarrier.下面我们就开始吧: 1.CyclicBarrier简介CyclicBarrier,是JDK1.5的java.uti ...
- Java并发编程原理与实战二十六:闭锁 CountDownLatch
关于闭锁 CountDownLatch 之前在网上看到过一篇举例非常形象的例子,但不记得是出自哪里了,所以这里就当自己再重新写一篇吧: 例子如下: 我们每天起早贪黑的上班,父母每天也要上班,有一天定了 ...
- 深入浅出 Java Concurrency (10): 锁机制 part 5 闭锁 (CountDownLatch)
此小节介绍几个与锁有关的有用工具. 闭锁(Latch) 闭锁(Latch):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态.通俗的讲就是,一个闭锁相当于一扇大门,在大门打开之前所有线程都被阻 ...
随机推荐
- 拷贝Maven依赖jar包到指定目录
一.导出到默认目录 targed/dependency 从Maven项目中导出项目依赖的jar包:进入工程pom.xml 所在的目录下,执行如下命令: 1 mvn dependency:copy-de ...
- MySQL索引原理(三)
多个单列索引和联合索引的区别详解 背景:为了提高数据库效率,建索引是家常便饭:那么当查询条件为2个及以上时,我们是创建多个单列索引还是创建一个联合索引好呢?他们之间的区别是什么?哪个效率高呢?我在这里 ...
- MySQL索引原理(二)
MySQL索引原理 1.索引 索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据.对于索引,会保存在额外的文件中.索引是数据库中专门用于帮助用户快速查询数据的一种数据结构. ...
- 阿里巴巴Druid数据源组件
目前常用的数据源主要有c3p0.dbcp.proxool.druid,先来说说他们Spring 推荐使用dbcp:Hibernate 推荐使用c3p0和proxool1. DBCP:apacheDBC ...
- 配置Zuul代理下游的认证
配置Zuul代理下游的认证 您可以通过proxy.auth.*设置控制@EnableZuulProxy下游的授权行为.例: application.yml proxy: auth: routes: c ...
- crc64
oss2\models.py class PartInfo(object): """表示分片信息的文件. 该文件既用于 :func:`list_parts < ...
- 029_H5打包编译成IOS
由于需要H5编写的应用在iPhone上使用,所以有了以下的需求 一. (1)下载npm,官网: http://nodejs.org/ 下载nodejs安装包 Reference:https://jin ...
- CocosCreator TypeScript项目 (vscode 设置中文,默认调试环境设置)
版本:2.2.1 深圳好多公司用的cocoscreator,学习一下. 这篇是如何安装,然后运行一个hello world. 一 下载 cocoscreator:https://www.cocos. ...
- BladeX 部署centos启动顺序
一:启动dockerservice docker start二:启动mysqldocker start mysql三:启动Harborsystemctl restart docker(如有修改daem ...
- Visual Studio + Qt:GetVarsFromMakefile任务意外失败
问题: IntelliSense报告找不到头文件: 编译时报告GetVarsFromMakefile任务意外失败. 解决: 删除从Visual Studio装的Qt插件: 从Qt官网下载最新的插件:h ...