闭锁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();
}
 
 
}
 

闭锁CountDownLatch与栅栏CyclicBarrier的更多相关文章

  1. 并发编程 04——闭锁CountDownLatch 与 栅栏CyclicBarrier

    Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...

  2. 多线程之倒计时器CountDownLatch和循环栅栏CyclicBarrier

    1.倒计时器CountDownLatch CountDownLatch是一个多线程控制工具类.通常用来控制线程等待,它可以让一个线程一直等待知道计时结束才开始执行 构造函数: public Count ...

  3. 栅栏——CyclicBarrier

    栅栏CyclicBarrier和闭锁CountDownLatch类似,可以说它们都是用来计数,都能阻塞一组线程知道某个事件发生.不同的是闭锁用于等待事件,而栅栏用于等待其他线程. 在前一篇<Co ...

  4. 多线程-栅栏CyclicBarrier

    上一篇总结了闭锁CountDownLatch,这一篇总结一下栅栏CyclicBarrier.它们两者之间的区别主要是,闭锁是等待一个事件发生,比如上一篇的田径比赛,运动员等待裁判哨声一响就可以开始跑, ...

  5. 十三、栅栏CyclicBarrier

    一.简介 栅栏CyclicBarrier的作用就是等待一组线程都准备好了,然后执行某个任务.这与CountDownLatch很相似. 但是CyclicBarrier和CountDownLatch是有区 ...

  6. java高并发系列 - 第17天:JUC中的循环栅栏CyclicBarrier常见的6种使用场景及代码示例

    这是java高并发系列第17篇. 本文主要内容: 介绍CyclicBarrier 6个示例介绍CyclicBarrier的使用 对比CyclicBarrier和CountDownLatch Cycli ...

  7. Java并发编程原理与实战二十七:循环栅栏:CyclicBarrier

    昨天我们学习了倒计数功能的等待,今天我们学习的是循环栅栏:CyclicBarrier.下面我们就开始吧: 1.CyclicBarrier简介CyclicBarrier,是JDK1.5的java.uti ...

  8. Java并发编程原理与实战二十六:闭锁 CountDownLatch

    关于闭锁 CountDownLatch 之前在网上看到过一篇举例非常形象的例子,但不记得是出自哪里了,所以这里就当自己再重新写一篇吧: 例子如下: 我们每天起早贪黑的上班,父母每天也要上班,有一天定了 ...

  9. 深入浅出 Java Concurrency (10): 锁机制 part 5 闭锁 (CountDownLatch)

    此小节介绍几个与锁有关的有用工具. 闭锁(Latch) 闭锁(Latch):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态.通俗的讲就是,一个闭锁相当于一扇大门,在大门打开之前所有线程都被阻 ...

随机推荐

  1. windows 10环境下安装Tensorflow-gpu

    网上有很多教程,特别是简写上的写的都还算比较详细.但我自己还是遇到了几个坑,希望对深度学习有兴趣的同学遇到跟我一样的坑,希望这份记录能帮助到你. 问题一:要不要使用Anaconda? 我看极客时间上的 ...

  2. Unity2019.1中文技术手册离线版

    使用离线版优质.系统化的教程.经验文档.参考手册,为开发者节省时间,提高效率! 解压后打开UnityDocumentation_2019.1/Manual/index.html 需要的自取,下载地址: ...

  3. SpringMVC(十六):如何使用编程方式替代/WEB-INF/web.xml中的配置信息

    在构建springmvc+mybatis项目时,更常用的方式是采用web.xml来配置,而且一般情况下会在web.xml中使用ContextLoaderListener加载applicationCon ...

  4. 【Python】解析Python中的装饰器

    python中的函数也是对象,函数可以被当作变量传递. 装饰器在python中功能非常强大,装饰器允许对原有函数行为进行扩展,而不用硬编码的方式,它提供了一种面向切面的访问方式. 装饰器 一个普通的装 ...

  5. maven项目中更新了核心库后导致一些包提示未定义,如:The import org.json cannot be resolved

    经查看发现了原因,因为核心库的版本没有变更,本地仓库只更新了核心库的jar部分的库,没有更新核心库pom项目.从而导致了一些库的引用提示未定义. 以后有新库更新,最好在本地库删除全部的相关库,再mav ...

  6. 解决catalina.out文件过大的问题

    有用Tomcat的人,绝对都会遇到这样一个问题:catalina.out文件过大. 它是Tomcat默认生成的日志文件,会随着时间的推移,逐渐增大,不断的增长,甚至达到几G,几十G的大小.由于文件过大 ...

  7. beetl模版for循环渲染字符串

    beetl for循环渲染html字符串的方式, beetl if条件判断输出, beet自定义标签和标签引用, beetl html赋值, beetl渲染json,beetl注释.变量定义, 更多文 ...

  8. go 垃圾回收机制

    转载一篇仔细分析了golang的垃圾回收策略以及发展的一篇文章 地址是https://mp.weixin.qq.com/s?__biz=MzAxNzMwOTQ0NA%3D%3D&mid=265 ...

  9. mysql报错 常见 1045 10061

    报错1045: 远程没有设置用户远程访问的权限 解决方案: 进行授权(红色是你的密码) 如果想root用户使用password从任何主机连接到mysql服务器的话. GRANT ALL PRIVILE ...

  10. 【剑指offer】和为S的连续正数序列

    题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他 ...