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

小咪咪 2023-06-17 09:55 58阅读 0赞

一、问题描述

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

  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. System.out.println("Thread is finished...");
  16. }
  17. }

执行结果:

format_png

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

二、解决方法

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. System.out.println("Thread is finished...");
  21. }
  22. }

执行结果:

format_png 1

2. CountDownLatch

CountDownLatch允许一个或多个线程等待其他线程执行完毕后再运行。

  • CountDownLatch的构造函数接收int类型的参数作为计数器,若要等待N个点再执行后续逻辑,就传入N。
  • 这里的N可以是N个线程,也可以是N个执行步骤。
  • 当我们调用countDown( )方法时,N会减一。
  • 调用await( ) 方法来阻塞当前线程,直到N减为0。

    public class ThreadTest {

    1. public static void main(String[] args) {
    2. CountDownLatch count = new CountDownLatch(2);
    3. String str;
    4. Thread thread1, thread2 = null;
    5. thread1 = new Thread(new Runnable() {
    6. @Override
    7. public void run() {
    8. System.out.println("Thread1" + " is running...");
    9. count.countDown();
    10. System.out.println("Thread1 " + " is finished...");
    11. }
    12. });
    13. thread2 = new Thread(new Runnable() {
    14. @Override
    15. public void run() {
    16. System.out.println("Thread2" + " is running...");
    17. count.countDown();
    18. System.out.println("Thread2" + " is finished...");
    19. }
    20. });
    21. thread1.start();
    22. thread2.start();
    23. try {
    24. count.await();
    25. } catch (InterruptedException e) {
    26. e.printStackTrace();
    27. }
    28. System.out.println("All is finished.");
    29. }

    }

执行结果:

format_png 2

发表评论

表情:
评论列表 (有 0 条评论,58人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java线协调运行

    一 点睛 借助于Object类提供的wait()、notify()和notifyAll()三个方法,可实现Java线程协调运行。这三个方法并不属于Thread类,而是属于Ob