【java】【多线程】等待开启的多个线程都执行完成,再做事情,怎么实现
今天在controller中写一个接口用来测试模拟多个请求同时到达 下订单的情况,
怎么能有效保证高并发下的库存和销量的一致性呢?【具体实现方法:https://www.cnblogs.com/sxdcgaq8080/p/9454161.html】
====
那么好,在这个接口中,开启多线程模拟了多个用户请求同时到达的状况,现在想在多个线程都执行完了以后再统一返回结果给前台,哪些请求成功了,哪些请求失败了。
====
所以现在的需求是怎么能实现 等待多个线程都执行完了以后再做事情~~~
===================================================================================================================================
其实想要实现这个需求:等待多个线程执行完了,再做事情。
有两种方法,可以应对不同的情况:
分别是CountDownLatch和CyclicBarrier
===================================================================================================================================
CountDownLatch和CyclicBarrier简单比较:
|
CountDownLatch |
CyclicBarrier |
|
|---|---|---|
|
软件包 |
java.util.concurrent |
java.util.concurrent |
|
适用情景 |
主线程等待多个工作线程结束 |
多个线程之间互相等待,直到所有线程达到一个障碍点(Barrier point) |
|
主要方法 |
CountDownLatch(int count) (主线程调用) 初始化计数 CountDownLatch.await (主线程调用) 阻塞,直到等待计数为0解除阻塞 CountDownLatch.countDown 计数减一(工作线程调用) |
CyclicBarrier(int parties, Runnable barrierAction) //初始化参与者数量和障碍点执行Action,Action可选。由主线程初始化 CyclicBarrier.await() //由参与者调用 阻塞,直到所有线程达到屏障点 |
|
等待结束 |
各线程之间不再互相影响,可以继续做自己的事情。不再执行下一个目标工作。 |
在屏障点达到后,允许所有线程继续执行,达到下一个目标。可以重复使用CyclicBarrier |
|
异常 |
如果其中一个线程由于中断,错误,或超时导致永久离开屏障点,其他线程也将抛出异常。 |
|
|
其他 |
如果BarrierAction不依赖于任何Party中的所有线程,那么在任何party中的一个线程被释放的时候,可以直接运行这个Action。 If(barrier.await()==2) { //do action } |
CountDownLatch 使用示例代码:
主线程调用
工作线程调用
package com.sxd.swapping.utils;
import org.junit.Test;
import java.util.concurrent.CountDownLatch;
public class ThreadTest {
/**
* 主线程
*/
@Test
public void test(){
//开启10个多线程
int threadCount = 10;
//所有线程阻塞,然后统一开始
CountDownLatch begin = new CountDownLatch(1);
//主线程阻塞,直到所有分线程执行完毕
CountDownLatch end = new CountDownLatch(threadCount);
//开始多线程
begin.countDown();
for (Integer i = 0; i < threadCount; i++) {
Runnable runnable = dealSomeThing(i,begin,end);
new Thread(runnable).start();
}
//多个线程都执行结束
try {
end.await();
System.out.println("多个线程都执行结束,可以做自己的事情了");
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("多线程执行中出错了,凉凉了!!!");
}
}
/**
* 工作线程
* 本方法 是在构造多线程要做的事情
*
* =====================可以做的事===================
* 当然可以传入ConcurrentHashMap之类的线程安全的 类
* 来记录线程中的处理结果之类的
* 最后 在多线程都执行完了以后 就可以对处理结果进行操作了
* ==================================================
*
* @param threadNum 当前线程编号
* @param begin
* @param end
* @return
*/
private Runnable dealSomeThing(int threadNum, CountDownLatch begin, CountDownLatch end){
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
System.out.println("线程"+threadNum+":--------------------->开始工作");
begin.await();
System.out.println("线程"+threadNum+"做具体的事情,比如去service调用 具体的方法做什么操作之类的");
end.countDown();
System.out.println("线程"+threadNum+":--------------------->结束工作");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
return runnable;
}
}
最后实现的结果:

=========================================================================================
CyclicBarrier使用示例代码:
现在还没用到,空闲了再补充
【java】【多线程】等待开启的多个线程都执行完成,再做事情,怎么实现的更多相关文章
- Java多线程系列--“基础篇”06之 线程让步
概要 本章,会对Thread中的线程让步方法yield()进行介绍.涉及到的内容包括:1. yield()介绍2. yield()示例3. yield() 与 wait()的比较 转载请注明出处:ht ...
- Java多线程系列--“基础篇”07之 线程休眠
概要 本章,会对Thread中sleep()方法进行介绍.涉及到的内容包括:1. sleep()介绍2. sleep()示例3. sleep() 与 wait()的比较 转载请注明出处:http:// ...
- Java多线程系列--“基础篇”10之 线程优先级和守护线程
概要 本章,会对守护线程和线程优先级进行介绍.涉及到的内容包括:1. 线程优先级的介绍2. 线程优先级的示例3. 守护线程的示例 转载请注明出处:http://www.cnblogs.com/skyw ...
- Java多线程(一) 什么是线程
声明:本系列大多是翻译自https://www.javatpoint.com,加上自己的增删改,尽力写的系统而通俗易懂,后文不再重复声明. 点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更 ...
- “全栈2019”Java多线程第六章:中断线程interrupt()方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- Java多线程(三)如何创建线程
点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更新中~ 正式篇: Java多线程(一) 什么是线程 Java多线程(二)关于多线程的CPU密集型和IO密集型这件事 Java多线程(三)如何 ...
- “全栈2019”Java多线程第十四章:线程与堆栈详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java多线程第十章:Thread.State线程状态详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- java中等待所有线程都执行结束(转)
转自:http://blog.csdn.net/liweisnake/article/details/12966761 今天看到一篇文章,是关于java中如何等待所有线程都执行结束,文章总结得很好,原 ...
随机推荐
- scrapy抓取学院新闻报告
抓取四川大学公共管理学院官网(http://ggglxy.scu.edu.cn)所有的新闻咨询. 实验流程 1.确定抓取目标.2.制定抓取规则.3.'编写/调试'抓取规则.4.获得抓取数据 1.确定抓 ...
- freemark学习
学习地址: http://blog.csdn.net/hejinxu/article/details/6694890 对freemarker的用法与语法进行了详细的讲解 http://freema ...
- css3属性书写的时候带的一些前缀的意思
使用css3属性时,大部分都要带这些识别前缀,早期点的浏览器才能识别.现在最新版的浏览器基本都支持css3 基本都不用写前缀 ,写前缀是为了向前兼容老版本的浏览器而已. -ms-transform: ...
- 5:django 常用函数
用django写view函数的时候,我们常常用到django.shortcuts里面的很多常用函数, 这节我们来看看这些函数的具体用法吧 render render(request, template ...
- Binary Tree Preorder Traversal——经典算法的迭代求解(前序,中序,后序都在这里了)
先序遍历,用递归来做,简单的不能再简单了.代码如下: (以下仅实现了先序遍历,中序遍历类似,后序遍历和这两个思路不一样,具体详见Binary Tree Postorder Traversal) /** ...
- Python3判断自身脚本是不是在运行
采用Socket方式,启动时占用一个端口,转化问题为判断端口是不是存在? import sys import locale import http.server import socketserver ...
- SQL快速入门 ( MySQL快速入门, MySQL参考, MySQL快速回顾 )
SQL 先说点废话,很久没发文了,整理了下自己当时入门 SQL 的笔记,无论用于入门,回顾,参考查询,应该都是有一定价值的,可以按照目录各取所需.SQL数据库有很多,MySQL是一种,本文基本都是SQ ...
- LoadRunner运行中的mmdrv和mdrv
在LoadRunner运行脚本过程中,在任务管理器中我们可以看到有一个或多个名为“mmdrv”的进程在运行,与此同时当我们查看LoadRunner\bin目录下的文件时还会看到一个“mdrv.exe” ...
- NHibernate框架与BLL+DAL+Model+Controller+UI 多层架构十分相似--『Spring.NET+NHibernate+泛型』概述、知识准备及介绍(一)
原文://http://blog.csdn.net/wb09100310/article/details/47271555 1. 概述 搭建了Spring.NET+NHibernate的一个数据查询系 ...
- jsp页面中获取session中的值
Jsp中获取Session: session是jsp的内置对象,所以你可以直接写在jsp的 <% session.setAttribute("a", b); //把b放到se ...