java 线程同时启动_java多个线程同时启动的两种方式
【背景】今天遇到一个并发问题,为了在开发环境复现这个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多个线程同时启动的两种方式相关推荐
- java native函数库_Java 层调用 Native 层函数的两种方式
概述 Java 层如何调用Native层函数,大家都应该知道使用JNI(Java 本地接口). 通过在java层声明native方法,然后遵守JNI规范命名Native函数,即可建立Java层nati ...
- Java面试题:synchronized和对象的访问定位的两种方式
说一说自己对于 synchronized 关键字的理解 ? synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者 代码块在任意时 ...
- java并行任务,Java 并发编程学习(五):批量并行执行任务的两种方式
Java 并发编程学习(五):批量并行执行任务的两种方式 背景介绍 有时候我们需要执行一批相似的任务,并且要求这些任务能够并行执行.通常,我们的需求会分为两种情况: 并行执行一批任务,等待耗时最长的任 ...
- Java通过图片url地址获取图片base64位字符串的两种方式
工作中遇到通过图片的url获取图片base64位的需求.一开始是用网上的方法,通过工具类Toolkit,虽然实现的代码比较简短,不过偶尔会遇到图片转成base64位不正确的情况,至今不知道为啥. 之后 ...
- [Java中实现Excel表导入导出]基于easy-poi和EasyExcel两种方式实现
第一种:基于easy-poi实现Excel导入导出 1.导出Excel表格 第一步:在pom文件中导入依赖 <!--基于easy-poi实现Excel导入导出--><dependen ...
- java class 生成对象_Java反射机制(创建Class对象的三种方式)
1:SUN提供的反射机制的类: java.lang.Class java.lang.reflect.Constructor java.lang.reflect.Field java.lang.refl ...
- java json解析 代码_Java构造和解析Json数据的两种方法详解一
在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...
- java数组循环扩容_Java中实现数组动态扩容的两种方法
Java中实现数组动态扩容的两种方法 java中初始化一个数组需要定义数组的容量,而在我们使用数组时往往会遇到数组容量不够的情况,此时我们就需要通过动态扩容的方式来来根据需求扩大数组的容量. 我们可以 ...
- java中写入文件_java中创建、写入文件的5种方式
在java中有很多的方法可以创建文件写文件,你是否真的认真的总结过?下面笔者就帮大家总结一下java中创建文件的五种方法. Files.newBufferedWriter(Java 8) Files. ...
- java调用外联服务用xml,Spring IOC 依赖注入的两种方式:XML和注解
IoC,直观地讲,就是容器控制程序之间的关系,而非传统实现中,由程序代码直接操控.这也就是所谓"控制反转"的概念所在.控制权由应用代码中转到了外部容器,控制权的转移是所谓反转.Io ...
最新文章
- 记一次Java多线程程序调试经历:HttpClient 死锁
- 《Linux内核设计与实现》读书笔记(七)- 中断处理【转】
- 2020年人工神经网络第二次作业-参考答案第六题
- android listview数据动态加载_Android | Tangram动态页面之路(六)数据分离
- 异步调用WebService方式!
- 计算机基础知识数据结构与算法,(计算机基础知识)[数据结构与算法] 图
- Java面向对象(3) —— 抽象类、接口、内部类、匿名内部类
- python调用rocketmq的api_rocketmq-python
- Cocos2d-x之MenuItem
- java中char占几bits_char类型占几个字节
- 计算机软考中级可以考监理工程师吗,软考中级信息系统监理师考试要求
- 给Excel的数字单元格左上角加上绿色小三角
- linux选择填空题
- The seventh Word-Day
- 关键词提取——有监督方法
- 机器学习入门:入手sklearn框架+线性回归+案例(基金数据的预测)
- 从新手到Flutter架构师,一篇就够!深度解析,值得收藏
- 2017CCF大数据学术会议大数据智能分析分论坛成功举办
- 用纯C语言分别实现增量式与位置式的PID自整定算法
- linux config
热门文章
- python中的import详解_python中的import
- 设计模式的理解:单例模式(Singleton)
- ArrayList源码
- 字少事大|两张表格教你快速选择适合的MCU进行物联网开发
- 用启明云端支持ESP32的GUI做了一个测温HMI交互界面
- android xml文件格式,android xml 资源文件中几个格式(@ ? @* @+)的含义
- r语言数据变量分段_R数据分析:用R语言做meta分析
- nacos 配置动态刷新_Nacos 动态刷新@RefreshScope 【实现配置和实例刷新】
- glide默认的缓存图片路径地址_手写一个静态资源中间件,加深了解服务器对文件请求的缓存策略...
- linux增加电子档案空间,Linux 建立 SWAP 档案空间