闭锁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):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态.通俗的讲就是,一个闭锁相当于一扇大门,在大门打开之前所有线程都被阻 ...
随机推荐
- Parallel.For循环与普通的for循环
前两天看书发现了一个新的循环Parallel.For,这个循环在循环期间可以创建多个线程并行循环,就是说循环的内容是无序的.这让我想到了我前面的牛牛模拟计算是可以用到这个循环的,我前面的牛牛模拟计算是 ...
- idea2017显示maven Project菜单
右侧就出现 maven project菜单了.
- crc64
oss2\models.py class PartInfo(object): """表示分片信息的文件. 该文件既用于 :func:`list_parts < ...
- 理解Spring定时任务@Scheduled的两个属性fixedRate和fixedDelay
fixedRate和fixedDelay都是表示任务执行的间隔时间 fixedRate和fixedDelay的区别:fixedDelay非常好理解,它的间隔时间是根据上次的任务结束的时候开始计时的.比 ...
- Android ANR log trace日志文件分析
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_25804863/article/ ...
- Mac OSX系统中Hadoop / Hive 与 spark 的安装与配置 环境搭建 记录
Mac OSX系统中Hadoop / Hive 与 spark 的安装与配置 环境搭建 记录 Hadoop 2.6 的安装与配置(伪分布式) 下载并解压缩 配置 .bash_profile : ...
- Android Studio Error:Execution failed for task ':app:compileDebugJavaWithJavac' 根本解决方法
造成这种异常的原因有很多.具体的还是要去终端编译,查看到底是什么地方出错了,然后具体问题具体分析. 终端进入项目的根目录,然后输入命令 gradlew compileDebugJavaWithJava ...
- python初级(302) 6 对象(一)
作业: 1.编写一个Dog类,并生成对象dog,属性包含颜色,大小,重量,可以汪汪叫,摇尾巴,跑 # -*- coding: utf-8 -*- class Dog: def __init__(sel ...
- java Random 抢红包算法
红包有一个总金额和总数量,领的时候随机分配金额. 维护一个剩余总金额和总数量,分配时,如果数量等于1,直接返回总金额,如果大于1,则计算平均值,并设定随机最大值为平均值的两倍,然后取一个随机值,如果随 ...
- python非官方扩展库
https://www.lfd.uci.edu/~gohlke/pythonlibs/ 安装方法: 1.下载自己需要的库文件 例如:Twisted-19.2.1-cp37-cp37m-win32.wh ...