【背景】今天遇到一个并发问题,为了在开发环境复现这个bug,需要让多个线程同时执行到某条语句。

【解决方案】

java1.5的concurrent包下的CyclicBarrier 和 CountDownLatch都能解决这个问题。不得不佩服Doug Lea!

【方法1】使用CyclicBarrier

public class TestCyclicBarrier {

class Worker implements Runnable{

CyclicBarrier cyclicBarrier;

public Worker(CyclicBarrier cyclicBarrier){

this.cyclicBarrier = cyclicBarrier;

}

@Override

public void run() {

try {

cyclicBarrier.await(); // 等待其它线程

System.out.println(Thread.currentThread().getName() + "启动@" + System.currentTimeMillis());

} catch (InterruptedException e) {

e.printStackTrace();

} catch (BrokenBarrierException e) {

e.printStackTrace();

}

}

}

public void doTest() throws InterruptedException {

final int N = 5; // 线程数

CyclicBarrier cyclicBarrier = new CyclicBarrier(N);

for(int i=0;i

new Thread(new Worker(cyclicBarrier)).start();

}

}

public static void main(String[] args) throws InterruptedException {

TestCyclicBarrier testCyclicBarrier = new TestCyclicBarrier();

testCyclicBarrier.doTest();

}

}

【方法1结果】

【方法2】使用CountDownLatch

package thread;

import java.util.concurrent.CountDownLatch;

public class TestCountDownLatch {

class Worker implements Runnable{

CountDownLatch countDownLatch;

Worker(CountDownLatch countDownLatch){

this.countDownLatch = countDownLatch;

}

@Override

public void run() {

try {

countDownLatch.await(); // 等待其它线程

System.out.println(Thread.currentThread().getName() + "启动@" + System.currentTimeMillis());

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

public void doTest() throws InterruptedException {

final int N = 5; // 线程数

CountDownLatch countDownLatch = new CountDownLatch(N);

for(int i=0;i

new Thread(new Worker(countDownLatch)).start();

countDownLatch.countDown();

}

}

public static void main(String[] args) throws InterruptedException {

TestCountDownLatch testCountDownLatch = new TestCountDownLatch();

testCountDownLatch.doTest();

}

}

【方法2结果】

java 线程同时启动_java多个线程同时启动的两种方式相关推荐

  1. java native函数库_Java 层调用 Native 层函数的两种方式

    概述 Java 层如何调用Native层函数,大家都应该知道使用JNI(Java 本地接口). 通过在java层声明native方法,然后遵守JNI规范命名Native函数,即可建立Java层nati ...

  2. Java面试题:synchronized和对象的访问定位的两种方式

    说一说自己对于 synchronized 关键字的理解 ? synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者 代码块在任意时 ...

  3. java并行任务,Java 并发编程学习(五):批量并行执行任务的两种方式

    Java 并发编程学习(五):批量并行执行任务的两种方式 背景介绍 有时候我们需要执行一批相似的任务,并且要求这些任务能够并行执行.通常,我们的需求会分为两种情况: 并行执行一批任务,等待耗时最长的任 ...

  4. Java通过图片url地址获取图片base64位字符串的两种方式

    工作中遇到通过图片的url获取图片base64位的需求.一开始是用网上的方法,通过工具类Toolkit,虽然实现的代码比较简短,不过偶尔会遇到图片转成base64位不正确的情况,至今不知道为啥. 之后 ...

  5. [Java中实现Excel表导入导出]基于easy-poi和EasyExcel两种方式实现

    第一种:基于easy-poi实现Excel导入导出 1.导出Excel表格 第一步:在pom文件中导入依赖 <!--基于easy-poi实现Excel导入导出--><dependen ...

  6. java class 生成对象_Java反射机制(创建Class对象的三种方式)

    1:SUN提供的反射机制的类: java.lang.Class java.lang.reflect.Constructor java.lang.reflect.Field java.lang.refl ...

  7. java json解析 代码_Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

  8. java数组循环扩容_Java中实现数组动态扩容的两种方法

    Java中实现数组动态扩容的两种方法 java中初始化一个数组需要定义数组的容量,而在我们使用数组时往往会遇到数组容量不够的情况,此时我们就需要通过动态扩容的方式来来根据需求扩大数组的容量. 我们可以 ...

  9. java中写入文件_java中创建、写入文件的5种方式

    在java中有很多的方法可以创建文件写文件,你是否真的认真的总结过?下面笔者就帮大家总结一下java中创建文件的五种方法. Files.newBufferedWriter(Java 8) Files. ...

  10. java调用外联服务用xml,Spring IOC 依赖注入的两种方式:XML和注解

    IoC,直观地讲,就是容器控制程序之间的关系,而非传统实现中,由程序代码直接操控.这也就是所谓"控制反转"的概念所在.控制权由应用代码中转到了外部容器,控制权的转移是所谓反转.Io ...

最新文章

  1. 记一次Java多线程程序调试经历:HttpClient 死锁
  2. 《Linux内核设计与实现》读书笔记(七)- 中断处理【转】
  3. 2020年人工神经网络第二次作业-参考答案第六题
  4. android listview数据动态加载_Android | Tangram动态页面之路(六)数据分离
  5. 异步调用WebService方式!
  6. 计算机基础知识数据结构与算法,(计算机基础知识)[数据结构与算法] 图
  7. Java面向对象(3) —— 抽象类、接口、内部类、匿名内部类
  8. python调用rocketmq的api_rocketmq-python
  9. Cocos2d-x之MenuItem
  10. java中char占几bits_char类型占几个字节
  11. 计算机软考中级可以考监理工程师吗,软考中级信息系统监理师考试要求
  12. 给Excel的数字单元格左上角加上绿色小三角
  13. linux选择填空题
  14. The seventh Word-Day
  15. 关键词提取——有监督方法
  16. 机器学习入门:入手sklearn框架+线性回归+案例(基金数据的预测)
  17. 从新手到Flutter架构师,一篇就够!深度解析,值得收藏
  18. 2017CCF大数据学术会议大数据智能分析分论坛成功举办
  19. 用纯C语言分别实现增量式与位置式的PID自整定算法
  20. linux config

热门文章

  1. python中的import详解_python中的import
  2. 设计模式的理解:单例模式(Singleton)
  3. ArrayList源码
  4. 字少事大|两张表格教你快速选择适合的MCU进行物联网开发
  5. 用启明云端支持ESP32的GUI做了一个测温HMI交互界面
  6. android xml文件格式,android xml 资源文件中几个格式(@ ? @* @+)的含义
  7. r语言数据变量分段_R数据分析:用R语言做meta分析
  8. nacos 配置动态刷新_Nacos 动态刷新@RefreshScope 【实现配置和实例刷新】
  9. glide默认的缓存图片路径地址_手写一个静态资源中间件,加深了解服务器对文件请求的缓存策略...
  10. linux增加电子档案空间,Linux 建立 SWAP 档案空间