Java:当前线程运行完毕,再运行后续逻辑

Java:当前线程运行完毕,再运行后续逻辑
一、问题描述
在程序设计中,可能存在这样的情景:主线程中存在一个子线程,子线程需要在执行完毕后为后续代码逻辑提供参数。但在代码执行时,子进程还没执行完毕,后续的代码已经开始执行了,这时候就会出现参数为空的异常,或是直接报错。

复制代码
1 public class ThreadTest {
2 public static void main(String[] args) {
3 String str;
4 Thread thread = null;
5 thread = new Thread(new Runnable() {
6 @Override
7 public void run() {
8 while(true){
9 System.out.println(“Thread is running…”);
10 break;
11 }
12 }
13 });
14 thread.start();
15
16 System.out.println(“Thread is finished…”);
17 }
18 }
复制代码
执行结果:

因此,如何才能使得子进程执行完毕后才开始运行后续代码呢?

二、解决方法

  1. join
    Thread类提供了一个join( )方法,其原理是不断检查子进程是否执行完毕,当子进程未执行完成时,调用该子进程的进程被阻塞,直到子进程执行完毕后,再继续运行调用进程。

按 Ctrl+C 复制代码
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...");
}

}
按 Ctrl+C 复制代码
执行结果:
在这里插入图片描述

  1. CountDownLatch
    CountDownLatch允许一个或多个线程等待其他线程执行完毕后再运行。
    CountDownLatch的构造函数接收int类型的参数作为计数器,若要等待N个点再执行后续逻辑,就传入N。
    这里的N可以是N个线程,也可以是N个执行步骤。
    当我们调用countDown( )方法时,N会减一。
    调用await( ) 方法来阻塞当前线程,直到N减为0。
    复制代码
    1 public class ThreadTest {
    2 public static void main(String[] args) {
    3 CountDownLatch count = new CountDownLatch(2);
    4 String str;
    5 Thread thread1, thread2 = null;
    6 thread1 = new Thread(new Runnable() {
    7 @Override
    8 public void run() {
    9 System.out.println(“Thread1” + " is running…");
    10 count.countDown();
    11 System.out.println(“Thread1 " + " is finished…”);
    12 }
    13 });
    14 thread2 = new Thread(new Runnable() {
    15 @Override
    16 public void run() {
    17 System.out.println(“Thread2” + " is running…");
    18 count.countDown();
    19 System.out.println(“Thread2” + " is finished…");
    20 }
    21 });
    22 thread1.start();
    23 thread2.start();
    24 try {
    25 count.await();
    26 } catch (InterruptedException e) {
    27 e.printStackTrace();
    28 }
    29 System.out.println(“All is finished.”);
    30 }
    31 }
    复制代码
    执行结果:
    在这里插入图片描述
    注:解决方案中第1点 join 已验证OK。
    原文地址:https://www.cnblogs.com/huiAlex/p/9034749.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值