文档章节

Java并发编程初级篇(四):等待子线程终止

阿拉德大陆的魔法师
 阿拉德大陆的魔法师
发布于 2016/11/23 11:36
字数 450
阅读 29
收藏 0

我们先看一个例子,在这个例子中你会发现主线程结束后,过了一段时间两个子线程才结束。

定义实现Runnable接口的线程类,模拟执行一定时间后结束。

public class MyRunnable implements Runnable{
    @Override
    public void run() {
        System.out.printf("%s: I am start working.\n", Thread.currentThread().getName());
        try {
            TimeUnit.SECONDS.sleep((long) (Math.random() * 10 + 1));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.printf("%s: I am end working.\n", Thread.currentThread().getName());
    }
}

定义主方法,启动两个子线程:

public class Main {
    public static void main(String[] args) {
        Thread thread1 = new Thread(new MyRunnable());
        Thread thread2 = new Thread(new MyRunnable());

        System.out.printf("%s: start two threads.\n", Thread.currentThread().getName());
        thread1.start();
        thread2.start();
        System.out.printf("%s: end.\n", Thread.currentThread().getName());
    }
}

查看控制台日志,你会发现主线程先于两个子线程而结束。

main: start two threads.
main: end.
Thread-1: I am start working.
Thread-0: I am start working.
Thread-1: I am end working.
Thread-0: I am end working.

当你想让主线程等待所有子线程执行结束后,再执行一段代码才结束,应该怎么做呢。Java提供了join()方法。我们重写主方法,在主方法中调用子线程的join()方法,即可让主线程进入WAITING状态并等待子线程终止后继续执行。

public class Main {
    public static void main(String[] args) {
        Thread thread1 = new Thread(new MyRunnable());
        Thread thread2 = new Thread(new MyRunnable());

        System.out.printf("%s: start two threads.\n", Thread.currentThread().getName());
        thread1.start();
        thread2.start();

        try {
            thread2.join();
            thread1.join();
            System.out.printf("%s: child runnable both ends.\n", Thread.currentThread().getName());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.printf("%s: end.\n", Thread.currentThread().getName());
    }
}

查看控制台日志,你会发现主线程在等待两个子线程终止之后才继续执行。

main: start two threads.
Thread-0: I am start working.
Thread-1: I am start working.
Thread-0: I am end working.
Thread-1: I am end working.
main: child runnable both ends.
main: end.

 

© 著作权归作者所有

共有 人打赏支持
阿拉德大陆的魔法师
粉丝 22
博文 91
码字总数 83019
作品 0
西城
程序员
读书笔记之《Java并发编程的艺术》-并发编程基础

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360....

Hi徐敏
2015/11/11
0
8
Java多线程学习(五)线程间通信知识点补充

系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Ja...

一只蜗牛呀
04/16
0
0
Java并发编程笔记之基础总结(二)

一.线程中断 Java 中线程中断是一种线程间协作模式,通过设置线程的中断标志并不能直接终止该线程的执行,而是需要被中断的线程根据中断状态自行处理。   1.void interrupt() 方法:中断线...

狂小白
07/17
0
0
Java 编程之美:并发编程高级篇之一

本文来自作者 追梦 在 GitChat 上分享 「Java 编程之美:并发编程高级篇之一」 编辑 | 工藤 前言 借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了。 ...

gitchat
05/24
0
0
计算机科学中抽象的好处与问题—伪共享实例分析

David John Wheeler有一句名言“计算机科学中的任何问题都可以通过加上一层间接层来解决”,一层不够就再加一层。后半句是我加的 (* ̄︶ ̄) ,虽然有点玩笑的意思,但是也的确能说明一些问题...

MageekChiu
01/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

InvalidKeyException: Illegal key size

Caused by: java.lang.RuntimeException: java.security.InvalidKeyException: Illegal key size 解决方案:去官方下载JCE无限制权限策略文件。 jdk 5: http://www.oracle.com/technetwork/j......

自由的开源
18分钟前
0
0
JAVA秒杀实现以及优化原理

秒杀与其他业务最大的区别在于:秒杀的瞬间, (1)系统的并发量会非常的大 (2)并发量大的同时,网络的流量也会瞬间变大。 关于(2),最常用的办法就是做页面静态化,也就是常说的前后端分...

小贱是个程序员
22分钟前
1
0
Spring Aop之Advisor解析

在上文Spring Aop之Target Source详解中,我们讲解了Spring是如何通过封装Target Source来达到对最终获取的目标bean进行封装的目的。其中我们讲解到,Spring Aop对目标bean进行代理是通过Ann...

爱宝贝丶
25分钟前
0
0
Java高级工程师面试阿里,阿里云,天猫,菜鸟,涉及到的知识点

前言: 分享 Java高级工程师面试阿里,阿里云,天猫,菜鸟,涉及到的知识点,文章有点长,但比较全面,阅读时间15分钟左右,干货满满。 一、HashMap的那些事 1.1、HashMap的实现原理 1.1.1、...

Java大蜗牛
50分钟前
2
0
nginx模块学习五 expires 浏览器缓存

缓存原理 语法 Syntax: expires [modified] time;expires epoch | max | off;Default: expires off;Context: http,server,location,if in location 例/etc/nginx/conf.d/default.con......

Romanceling
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部