一、使用 CountDownLatch 模拟多线程并发(并行)

CountDownLatch 介绍:

  • countDownLatch是在java1.5被引入,跟它一起被引入的工具类还有CyclicBarrier、Semaphore、concurrentHashMap和BlockingQueue。
  • 存在于java.util.cucurrent包下。

作用:

  • CountDownLatch典型用法:1、某一线程在开始运行前等待n个线程执行完毕。将CountDownLatch的计数器初始化为new CountDownLatch(n),每当一个任务线程执行完毕,就将计数器减1 countdownLatch.countDown(),当计数器的值变为0时,在CountDownLatch上await()的线程就会被唤醒。一个典型应用场景就是启动一个服务时,主线程需要等待多个组件加载完毕,之后再继续执行。
  • CountDownLatch典型用法:2、实现多个线程开始执行任务的最大并行性。注意是并行性,不是并发,强调的是多个线程在某一时刻同时开始执行。类似于赛跑,将多个线程放到起点,等待发令枪响,然后同时开跑。做法是初始化一个共享的CountDownLatch(1),将其计算器初始化为1,多个线程在开始执行任务前首先countdownlatch.await(),当主线程调用countDown()时,计数器变为0,多个线程同时被唤醒

实现:典型用法2:

public class InitService {private static final Logger log = LoggerFactory.getLogger(InitService.class);public static final int THREAD_NUM = 200;private static int mobile = 0;//    @Autowired
//    private ConcurrencyService concurrencyService;
//
//    @Autowired
//    private CommonMqService commonMqService;public static void generateMultiThread() {log.info("开始初始化线程数----> ");//TODO:计算器初始化为1CountDownLatch countDownLatch = new CountDownLatch(1);try {//TODO:使用线程池启动线程  并行量200ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().build();ExecutorService singleThreadPool = new ThreadPoolExecutor(200, 200,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<>(1024), namedThreadFactory, new AbortPolicy());//TODO:启动多个线程for (int i = 0; i < THREAD_NUM; i++) {singleThreadPool.execute(new RunThread(countDownLatch));}singleThreadPool.shutdown();} catch (Exception e) {e.printStackTrace();}finally {//TODO:线程等待变量减少 释放所有线程 同时跑countDownLatch.countDown();}}private static class RunThread implements Runnable {private final CountDownLatch startLatch;public RunThread(CountDownLatch startLatch) {this.startLatch = startLatch;}@Overridepublic void run() {try {//TODO: 线程等待 等待剩余所有线程准备完毕 一起执行startLatch.await();mobile += 1;System.out.println("手机号为"+mobile+"的线程"+Thread.currentThread().getName()+"已执行");     } catch (Exception e) {e.printStackTrace();}}}//测试public static void main(String[] args) {generateMultiThread();}
}

结果:

可以看到线程执行的顺序,并不是顺序执行,而且错乱执行,200个线程共同执行的结果。

Java 模拟多线程并发案例相关推荐

  1. java 模拟多线程并发_Java中模拟同时并发请求

    有时需要测试一下某个功能的并发性能,又不要想借助于其他工具,索性就自己的开发语言,来一个并发请求就最方便了. java中模拟并发请求,自然是很方便的,只要多开几个线程,发起请求就好了.但是,这种请求, ...

  2. java基础-多线程应用案例展示

    java基础-多线程应用案例展示 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.两只熊,100只蜜蜂,蜜蜂每次生产的蜂蜜量是1,罐子的容量是30,熊在罐子的蜂蜜量达到20的时候 ...

  3. Java接口多线程并发测试 (一)

    本文为作者原创,禁止转载,违者必究法律责任!!! 本文为作者原创,禁止转载,违者必究法律责任!!! Java接口多线程并发测试 一,首先写一个接口post 请求代码: import org.apach ...

  4. Java模拟实现并发

    Java模拟实现并发 import org.springframework.beans.factory.annotation.Autowired; import org.springframework ...

  5. java sqlite 多线程并发_C#_C#解决SQlite并发异常问题的方法(使用读写锁),本文实例讲述了C#解决SQlite并 - phpStudy...

    C#解决SQlite并发异常问题的方法(使用读写锁) 本文实例讲述了C#解决SQlite并发异常问题的方法.分享给大家供大家参考,具体如下: 使用C#访问sqlite时,常会遇到多线程并发导致SQLI ...

  6. java sqlite 多线程并发_sqlite之多线程总结

    12.android 多线程数据库读写分析与优化 11.多线程操作Sqlite? ==== 最新需要给软件做数据库读写方面的优化,之前无论读写,都是用一个 SQLiteOpenHelper.getWr ...

  7. Linux网络编程基础及多线程并发案例

    目录 1.ip:端口  TCP/IP协议 2.socket 头文件  sys/socket.h 3.字节序 4.ip地址转换函数 5.sockaddr和sockaddr_in 6.服务器端基本函数 b ...

  8. java核心技术-多线程并发设计原理以及常见面试题

    文章目录 写在前面 多线程回顾 Thread和Runnable 面试官:为什么我们在项目中推荐使用使用Runnable方法而不用继承Thread? 面试官:Callable为什么可以带返回值,你知道底 ...

  9. java模拟多线程买票问题

    多线程买票是java中的一个经典案例,其主要思想无非包括2点,synchronized和锁,两者中,前者实现同步,后者为同步的线程提供锁,从而实现多个线程共享同一份资源时候,能够同步进行; 经典的方式 ...

最新文章

  1. 通俗易懂!白话朴素贝叶斯
  2. angular学习笔记之父子传值
  3. java编译源文件_Java实现编译源文件(Java源码)
  4. 基于昇腾CANN的卡通图像生成可在线体验啦!十分钟带你了解CANN应用开发全流程
  5. JS面向对象系列之一[prototype,原型]
  6. DataX实现oracle到oracle之间的数据传递
  7. 如何清空c盘只剩系统_怎么清空c盘只保留系统文件,详情介绍
  8. 樱花大战资源分析之二 SPR文件格式不完全分析
  9. 胡波外挂做模具3D装配的方法
  10. 如何用几何画板中绘制三角形内切圆
  11. ICG-NHS吲哚菁绿-琥珀酰亚胺脂的相关简介;CAS: 1622335-40-3
  12. 【Educoder作业】冯·诺依曼体系结构及工作原理理解
  13. 零元学Expression Design 4 - Chapter 7 使用内建功能「Clone」来达成Path的影分身之术...
  14. windows 快捷键之新建文件夹
  15. 为什么有些人说单片机简单,我学起来这么吃力?
  16. MATLAB中audioread函数用法
  17. Shiro授权--注解式开发
  18. IM即时通讯系统架构
  19. 利用R语言爬取安居客中经纪人数据,并将结果导入msql数据库
  20. shiro的 认证 与 授权

热门文章

  1. 有道云笔记and印象笔记
  2. 订单过期 自动取消实现方案
  3. 使用CustomValidator验证
  4. 点击图片按钮 出来图片预览不兼容360极速模式 其他兼容
  5. python的itchat获取微信好友数量和性别统计
  6. 关于BindingException: Invalid bound statement (not found) 不同的解决方法,看看是不是和我一样
  7. 吃鸡(绝地求生)进入游戏时出现Driver Load Error(1450) 错误的解决方案
  8. 为什么要找一个好工作
  9. HDU 1002 A + B Problem II
  10. 车站计算机系统的组成及基本功能,城市轨道交通自动售检票系统的组成与功能...