• 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( )方法,其原理是不断检查子进程是否执行完毕,当子进程未执行完成时,调用该子进程的进程被阻塞,直到子进程执行完毕后,再继续运行调用进程。

     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         try {
    16             thread.join();
    17         } catch (InterruptedException e) {
    18             e.printStackTrace();
    19         }
    20 
    21         System.out.println("Thread is finished...");
    22     }
    23 }

    执行结果:

    2. 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 }

    执行结果:

  • 相关阅读:
    【转】【矩阵】坐标的矩阵变换
    cocos2d-x聊天气泡
    lua自用的函数收集
    lua错误收集
    cocos2d-x中CCEditbox导出到lua
    love2d杂记9--光照效果
    (转)love2d有用的辅助库--gamework
    XPath语法 在C#中使用XPath示例
    WCF的CommunicationObjectFaultedException异常问题
    WCF绑定(Binding)
  • 原文地址:https://www.cnblogs.com/huiAlex/p/9034749.html
Copyright © 2020-2023  润新知