闭锁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):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态.通俗的讲就是,一个闭锁相当于一扇大门,在大门打开之前所有线程都被阻 ...
随机推荐
- DELPHI开始支持LINUX DOCKER
DELPHI开始支持LINUX DOCKER 本方翻译自Marco Cantu的文章. 在过去的几年中,将服务器端解决方案(实际上是任何类型的应用程序)部署到轻量级容器而不是物理机器或虚拟机已经变得越 ...
- SpringMVC(十四):SpringMVC 与表单提交(post/put/delete的用法);form属性设置encrypt='mutilpart/form-data'时,如何正确配置web.xml才能以put方式提交表单
SpringMVC 与表单提交(post/put/delete的用法) 为了迎合Restful风格,提供的接口可能会包含:put.delete提交方式.在springmvc中实现表单以put.dele ...
- Self-Supervised Representation Learning
Self-Supervised Representation Learning 2019-11-11 21:12:14 This blog is copied from: https://lilia ...
- 我的node-webkit笔记
话不多说,直接上码: index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8&q ...
- jstl标签库使用报错index_jsp.java找不到问题
初学jstl的时候记得只需要讲jstl和standard的jar放在lib下面,然后jsp中使用对应导入语法就可以使用标签库了. 但那时候用的是myeclipes,myeclipes的导包的过程记得是 ...
- FineReport简单上手
一.简介 FineReport是一个企业级报表制作.分析和展示工具 官网可以下载个人版进行体验学习:(windows版本设计器) https://www.finereport.com/product/ ...
- mac node配置path
一.查看node安装路径 whitch node 二.打开配置文件 vi ./.bash_profile 三.添加一行PATH(按i进入insert才能编辑) export NODE_HOME=&qu ...
- cmd大全
CMD命令:开始->运行->键入cmd或command(在命令行里可以看到系统版本.文件系统版本) 1. appwiz.cpl:程序和功能 2. calc:启动计算器 3. certmgr ...
- Spring MVC -- 单元测试和集成测试
测试在软件开发中的重要性不言而喻.测试的主要目的是尽早发现错误,最好是在代码开发的同时.逻辑上认为,错误发现的越早,修复的成本越低.如果在编程中发现错误,可以立即更改代码:如果软件发布后,客户发现错误 ...
- (转)mysql使用Navicat 导出和导入数据库
mysql使用Navicat 导出和导入数据库 ps:在导入本地数据库的时候,要先建立相同的数据库,然后再运行sql文件,即可导入相应的数据库