假设有线程1/线程2/线程3,线程3必须在线程1/线程2执行完成之后开始执行,有两种方式可实现

  • Thread类的join方法:使宿主线程阻塞指定时间或者直到寄生线程执行完毕
  • CountDownLatch类:指定计数器,当计数器清零即取消阻塞
package com.concurrent.test;

import java.util.concurrent.CountDownLatch;

import org.junit.Assert;
import org.junit.Test; /**
* 规定线程的执行顺序
*/
public class ThreadOrderTest { private long millisUnit = 1000;
private int count = 2; class ThreadOrder {
/*
* join方法使多个线程依次执行
*/
public long preserveOrderViaJoin() throws InterruptedException {
long startMillis = System.currentTimeMillis();
Thread tmp; for (int i = 0; i < count; i++) {
tmp = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(millisUnit);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "join-" + i);
tmp.start();
tmp.join();//不停地监测线程是否执行完成,执行完成才继续往下
}
return System.currentTimeMillis() - startMillis;
} /*
* CountdownLatch可同时阻塞多个线程,但它们可并发执行
*/
public long preserveOrderViaCountdownLatch() throws InterruptedException {
long startMillis = System.currentTimeMillis();
final CountDownLatch countDownLatch = new CountDownLatch(count);
for (int i = 0; i < count; i++) {
new Thread(new Runnable() { @Override
public void run() {
try {
Thread.sleep(millisUnit);
} catch (InterruptedException e) {
e.printStackTrace();
}
//只要计数器清零,等待的线程就可以开始执行,于是可以达到并发的效果
countDownLatch.countDown();
}
},"countDownLatch-" + i).start();
}
countDownLatch.await();
return System.currentTimeMillis() - startMillis; }
} @Test
public void testPreserveOrderViaJoin() throws InterruptedException {
ThreadOrder threadOrder = new ThreadOrder();
Assert.assertEquals(count, threadOrder.preserveOrderViaJoin() / millisUnit);
} @Test
public void testPreserveOrderViaCountdownLatch() throws InterruptedException {
ThreadOrder threadOrder = new ThreadOrder();
Assert.assertEquals(1, threadOrder.preserveOrderViaCountdownLatch() / millisUnit);
}
}

【Java多线程系列四】控制线程执行顺序的更多相关文章

  1. Java多线程系列四——控制线程执行顺序

    假设有线程1/线程2/线程3,线程3必须在线程1/线程2执行完成之后开始执行,有两种方式可实现 Thread类的join方法:使宿主线程阻塞指定时间或者直到寄生线程执行完毕 CountDownLatc ...

  2. Java多线程学习(四)---控制线程

    控制线程 摘要: Java的线程支持提供了一些便捷的工具方法,通过这些便捷的工具方法可以很好地控制线程的执行 1. join线程控制,让一个线程等待另一个线程完成的方法 2. 后台线程,又称为守护线程 ...

  3. java多线程系列(四)---Lock的使用

    Lock的使用 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我的理 ...

  4. java多线程系列(四)---ReentrantLock的使用

    Lock的使用 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我的理 ...

  5. (Java多线程系列九)线程池

    线程池 1.什么是线程池 线程池是指在初始化一个多线程应用程序过程中创建一个线程集合,然后在需要执行新的任务时重用这些线程而不是新建一个线程.线程池中线程的数量通常取决于可用内存数量和应用程序的需求. ...

  6. Java之CountDownLatch ---控制线程执行顺序

    一,类介绍 这是java.util.concurrent包里的一个同步辅助类,它有两个主要的常用方法  countDown()方法以及await()方法.在完成一组正在其他线程中执行的操作之前,它允许 ...

  7. java多线程系列六、线程池

    一. 线程池简介 1. 线程池的概念: 线程池就是首先创建一些线程,它们的集合称为线程池. 2. 使用线程池的好处 a) 降低资源的消耗.使用线程池不用频繁的创建线程和销毁线程 b) 提高响应速度,任 ...

  8. Java多线程——<三>简单的线程执行:Executor

    一.概述 按照<Java多线程——<一><二>>中所讲,我们要使用线程,目前都是显示的声明Thread,并调用其start()方法.多线程并行,明显我们需要声明多个 ...

  9. (Java多线程系列三)线程间通讯

    Java多线程间通讯 多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同. 1.使用wait()和notify()方法在线程中通讯 需求:第一个线程写入(input)用户,另一个线程 ...

随机推荐

  1. python学习笔记:数据类型——数字、字符串、元祖、字典

    计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等各种各样的数据,不同的数据,需要定义不同的数 ...

  2. QTP - excel操作

    1. 以数据库的形式访问Excel 通常,我们与Excel的交互,是通过创建Excel对象的方式: Set ExcelApp = CreateObject("Excel.Applicatio ...

  3. python面试题之如何解决验证码的问题,用什么模块,听过哪些人工打码平台?

    如何解决验证码的问题,用什么模块,听过哪些人工打码平台? PIL.pytesser.tesseract模块 平台的话有:(打码平台特殊,不保证时效性) 云打码 挣码 斐斐打码 若快打码 超级鹰 本文首 ...

  4. 是否有任何python库可以从自然语言中解析日期和时间?

    我正在寻找的是可以将“明天早上6点”或“中午的下一个模拟”转换为适当的日期时间对象. 解决方案 parsedatetime - 能够解析“人类可读”日期/时间表达式的Python模块. #!/usr/ ...

  5. 嵌入式平台 RAM与ROM区分

    ROM(Read Only Memory)和RAM(Random Access Memory)指的都是半导体存储器,ROM在系统停止供电的时候仍然可以保持数据,而RAM通常是在掉电之后就丢失数据,典型 ...

  6. Java web 应用自启动 shell脚本自动重启

    之前公司的内部管理系统jenkins自动构建代码有时候会失效,导致服务停掉. 于是乎就搞了一个自动启动脚本. oa.jar就是监测的服务 startup.sh 的内容是运行jar包的命令 java - ...

  7. JAVA企业级应用服务器之TOMCAT实战

    JAVA企业级应用服务器之TOMCAT实战 链接:https://pan.baidu.com/s/1c6pZjLeMQqc9t-OXvUM66w 提取码:uwak 复制这段内容后打开百度网盘手机App ...

  8. Codeforces 1105E 最大独立集 状态DP 中途相遇法

    题意:你有一个字符串, 有两种操作,一种是改变字符串,一种是某个用户询问这个字符串,如果一个用户每次查询字符串的时候都是他的用户名,他就会高兴.问最多有多少个用户会高兴? 题意:容易发现,在两个1操作 ...

  9. androidstudio 2.3.3 jni过程汇总(2):2、使用so文件

    2.使用so文件 1.在java文件中System.loadLibrary加载包,并且引入native方法. 2.在app/src/main/下新建jniLibs文件夹,将so包带arm文件夹形式导入 ...

  10. Java的HashMap和Hashtable有什么区别HashSet和HashMap有什么区别?使用这些结构保存的数需要重载的方法是哪些?

    HashMap与Hashtable实现原理相同,功能相同,底层都是哈希表结构,查询速度快,在很多情况下可以互用 两者的主要区别如下 1.Hashtable是早期JDK提供的接口,HashMap是新版J ...