Java:当前线程运行完毕,再运行后续逻辑
一、问题描述
在程序设计中,可能存在这样的情景:主线程中存在一个子线程,子线程需要在执行完毕后为后续代码逻辑提供参数。但在代码执行时,子进程还没执行完毕,后续的代码已经开始执行了,这时候就会出现参数为空的异常,或是直接报错。
public class ThreadTest {
public static void main(String[] args) {
String str;
Thread thread = null;
thread = new Thread(new Runnable() {
@Override
public void run() {
while(true){
System.out.println("Thread is running...");
break;
}
}
});
thread.start();
System.out.println("Thread is finished...");
}
}
执行结果:

因此,如何才能使得子进程执行完毕后才开始运行后续代码呢?
二、解决方法
1. join
Thread类提供了一个join( )方法,其原理是不断检查子进程是否执行完毕,当子进程未执行完成时,调用该子进程的进程被阻塞,直到子进程执行完毕后,再继续运行调用进程。
public class ThreadTest {
public static void main(String[] args) {
String str;
Thread thread = null;
thread = new Thread(new Runnable() {
@Override
public void run() {
while(true){
System.out.println("Thread is running...");
break;
}
}
});
thread.start();
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread is finished...");
}
}
执行结果:

2. CountDownLatch
CountDownLatch允许一个或多个线程等待其他线程执行完毕后再运行。
- CountDownLatch的构造函数接收int类型的参数作为计数器,若要等待N个点再执行后续逻辑,就传入N。
- 这里的N可以是N个线程,也可以是N个执行步骤。
- 当我们调用countDown( )方法时,N会减一。
- 调用await( ) 方法来阻塞当前线程,直到N减为0。
public class ThreadTest {
public static void main(String[] args) {
CountDownLatch count = new CountDownLatch(2);
String str;
Thread thread1, thread2 = null;
thread1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Thread1" + " is running...");
count.countDown();
System.out.println("Thread1 " + " is finished...");
}
});
thread2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Thread2" + " is running...");
count.countDown();
System.out.println("Thread2" + " is finished...");
}
});
thread1.start();
thread2.start();
try {
count.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("All is finished.");
}
}
执行结果:

Java:当前线程运行完毕,再运行后续逻辑的更多相关文章
- Java主线程等待所有子线程执行完毕再执行解决办法(转)
方法一: Thread.join()方法,亲测可行,thread.join()方法 Vector<Thread> ts = new Vector<Thread>(); for ...
- delphi 中使用WaitForMultipleObjects等待线程执行,再执行后续代码
unit1 [delphi] view plain copyunit Unit1; interface uses Windows, Messages, SysUtils, Variants, Clas ...
- java消息中间件 RocketMQ Linux安装与运行
阿里巴巴宣布捐赠RocketMQ到Apache软件基金会孵化项目,最近闲下来便去部署了一个试验版本玩玩. 至于RockeMQ是什么,原理架构什么的这里就不赘述了,这里只记录安装过程. 一.系统环境 s ...
- Java线程——线程习题(一)子线程执行10次后,主线程再运行5次,这样交替执行三遍
题目:子线程执行10次后,主线程再运行5次,这样交替执行三遍 代码如下: package com.itheima.gan; /** * 子线程执行10次后,主线程再运行5次,这样交替执行三遍 * @a ...
- 【JAVA并发第二篇】Java线程的创建与运行,线程状态与常用方法
1.线程的创建与运行 (1).继承或直接使用Thread类 继承Thread类创建线程: /** * 主类 */ public class ThreadTest { public static voi ...
- Java实现终止线程池中正在运行的定时任务
源于开发 最近项目中遇到了一个新的需求,就是实现一个可以动态添加定时任务的功能.说到这里,有人可能会说简单啊,使用quartz就好了,简单粗暴.然而quartz框架太重了,小项目根本不好操作啊.当然, ...
- java并发编程学习:如何等待多个线程执行完成后再继续后续处理(synchronized、join、FutureTask、CyclicBarrier)
多线程应用中,经常会遇到这种场景:后面的处理,依赖前面的N个线程的处理结果,必须等前面的线程执行完毕后,后面的代码才允许执行. 在我不知道CyclicBarrier之前,最容易想到的就是放置一个公用的 ...
- java并发:中断一个正在运行的线程
要使任务和线程能安全可靠地停止,并不是一件很容易的事情,java没有提供任何机制来安全地终止线程,那么我们该怎么办呢? 下面我们先来了解一下java中的中断机制: java中断机制是一种协作机制,也就 ...
- 8 cocos2dx加入场景切换效果,控制场景切换彻底完毕之后再运行动画
1 加入场景切换效果 供场景切换的类: CCTransitionJumpZoom CCTransitionProgressRadialCCW CCTransitionProgressRadial ...
随机推荐
- ImportError: libmysqlclient.so.20: cannot open shared object file: No such file or directory 解决办法
>>> import MySQLdbTraceback (most recent call last): File "<stdin>", line ...
- 用poi-3.6-20091214.jar 实现java给excel资料加密
用poi-3.6-20091214.jar 实现java给excel文件加密我用了网上的很多方法,但是都没有成功! HSSFWorkbook wb = new HSSFWorkbook(new Fil ...
- 在WAS下找不到主机名称的问题
发生错误: 联合 ADMU0036E: Deployment Manager 不能根据名称主机 cdzfwas2 在地址 127.0.0.1 查找 期间发生错误:正在回滚到原始配置 ...
- Intellij IDEA 代码提示忽略大小写
1.0 File >>Settings 2.0 Editor >> General >> Code Completion 如下图 选择 None
- SOJ1029 Humble Numbers (枚举)
A number whose only prime factors are 2,3,5 or 7 is called a humble number. The sequence 1, 2, 3, 4, ...
- Python常用库之一:Numpy
Numpy支持大量的维度数组和矩阵运算,对数组运算提供了大量的数学函数库! Numpy比Python列表更具优势,其中一个优势便是速度.在对大型数组执行操作时,Numpy的速度比Python列表的速度 ...
- PHP日志 LOG4PHP 的配置与使用
维护了 一个老项目, 没有日志功能, 就给加了这个log4php, 主要是集成进去很简单,使用起来也够用了. 1.下载log4php 2.创建配置文件 log4php_config.xml < ...
- C#和C++的Socket通信
最近在用C#做一个项目的时候,Socket发送消息的时候遇到了服务端需要接收C++结构体的二进制数据流,这个时候就需要用C#仿照C++的结构体做出一个结构来,然后将其转换成二进制流进行发送,之后将响应 ...
- php新闻静态化方法
$view=file_get_contents('./a.tpl'); //新闻详情页模板模式,需要数据位置定义标签如{title},{content} $php_content=str_replac ...
- LeetCode28.实现strStr() JavaScript
实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始).如果不存在,则返 ...