一、问题描述

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

 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.");
}
}

执行结果:

最新文章

  1. SharePoint 2013 版本功能对比
  2. jstree静态生成树并为树添加触发事件
  3. Charles初体验
  4. iOS开发UI篇——简单的浏览器查看程序
  5. Mysql 源码编译教程贴
  6. /etc/motd and /etc/issue
  7. PHP中的几个重要比较
  8. Android Activity和Fragment生命周期图
  9. 编写高性能SQL的注意事项
  10. 欲练JS,必先攻CSS——前端修行之路
  11. fineui webform
  12. ngRx 官方示例分析 - 5. components
  13. mtcnn
  14. H3C IRF MAD检测原理及相关问题验证
  15. ASP.NET MVC用户登录(Memcache存储用户登录信息)
  16. (转)Spring Cloud(一)
  17. Retrofit Token过期 重新请求Token再去请求接口
  18. [C基础修炼] [C课程设计]C语言课程设计之图书管理系统
  19. Javascript php 异常捕获
  20. sencha touch NavigationView 嵌套 TabPanel 的问题

热门文章

  1. Chosen三级联动
  2. Architecture pattern & Architecture style
  3. js获取昨天今天和明天
  4. 【[USACO15JAN]草鉴定Grass Cownoisseur】
  5. Time Zone 【模拟时区转换】(HDU暑假2018多校第一场)
  6. [转]CUDA在Windows下的软件开发环境搭建
  7. Redis通过IO进行序列化+反序列化
  8. 移动端meta标签的设置
  9. Finder 的分栏显示模式宽度调整
  10. Python之基本排序算法的实现