文档章节

Java 多线程 - 线程 - 等待线程的终止

pan_1308
 pan_1308
发布于 2017/09/05 11:31
字数 789
阅读 6
收藏 0

一、概述

背景需求

      当我们的程序在执行其他的任务时,必须先初始化一些必须的资源。可以使用线程来完成这些初始化任务,等待线程终止,再执行程序的其他任务。为了达到这个目的,可以使用 Thread类的 join() 方法。

或者例如,如果子线程里要进行大量的耗时的运算,主线程可能会在子线程执行完之前结束,但是如果主线程又需要用到子线程的处理结果,也就是主线程需要等待子线程执行完成之后再结束,这个时候就要用到join()。

join() 的作用:将另外一个线程 join到当前线程,则需要等到 join进来的线程执行完才会继续执行当前线程。

使用前提

1、join方法只有在继承了 Thread 类的线程中才有。

2、线程必须要 start() 后再 join才能起作用。

常用方法

join(long millis)   --》 指 当一个线程 调用 其他某个线程的 join() 方法时,那么它不必等到被调用线程运行终止,如果参数指定的 毫秒时钟已经到达,它将继续运行。

join(long millis, int nanos)  --》 如: thread1 中 使用 thread2.join(1000); 当满足 下面 2个条件中的 任意一个,thread1 将 继续执行:

    》》 thread2 运行已经完成。

    》》 时钟已经过去 1000 毫秒。

二、实现

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;

public class DataSourceLoader implements Runnable{
	
    @Override
    public void run() {
    	System.out.println(Thread.currentThread().getName() + "> 加载开始.." 
              + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()));
    	try {
			TimeUnit.SECONDS.sleep(3);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
    	System.out.println(Thread.currentThread().getName() + "> 加载完成.." 
              + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()));
    }
	
}

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;

public class ConnectionLoader implements Runnable{
	
	@Override
    public void run() {
    	System.out.println(Thread.currentThread().getName() + "> 加载开始.." 
              + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()));
    	try {
			TimeUnit.SECONDS.sleep(6);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
    	System.out.println(Thread.currentThread().getName() + "> 加载完成.." 
              + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()));
    }

}
import java.text.SimpleDateFormat;
import java.util.Date;

public class JoinTest {

	public static void main(String[] args) {
		 DataSourceLoader dataSourceLoader = new DataSourceLoader();
		 Thread thread1 = new Thread(dataSourceLoader, "DataSourceLoad Thread");
		 
		 ConnectionLoader connectionLoader = new ConnectionLoader();
		 Thread thread2 = new Thread(connectionLoader, "ConnectionLoader Thread");
		 
		 thread1.start(); 
		 thread2.start();
		 
		 try {
//			thread1.join();  // 将 thread1 线程 join 到 主线程  =》 表示 thread1 线程结束,主线程才能继续
//			thread2.join();  // 将 thread2 线程 join 到 主线程  =》 表示 thread2 线程结束,主线程才能继续执行
			thread1.join(3*1000);
			thread2.join(2*1000);  //  => 将 thread2 线程 join 到 主线程,加入后 过了 2 ms 后,主线程才能继续执行
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println(Thread.currentThread().getName() + "> 整个配置 加载完成.." 
	              + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date())); 
	}
	
}
//设置为:thread1.join(3*1000);
//       thread2.join(2*1000); 
// console结果:
ConnectionLoader Thread> 加载开始..2017-09-05 11:24:30
DataSourceLoad Thread> 加载开始..2017-09-05 11:24:30
DataSourceLoad Thread> 加载完成..2017-09-05 11:24:33
main> 整个配置 加载完成..2017-09-05 11:24:35
ConnectionLoader Thread> 加载完成..2017-09-05 11:24:36


//设置为:thread1.join();
//       thread2.join(); 
// console结果:
DataSourceLoad Thread> 加载开始..2017-09-05 11:30:05
ConnectionLoader Thread> 加载开始..2017-09-05 11:30:05
DataSourceLoad Thread> 加载完成..2017-09-05 11:30:08
ConnectionLoader Thread> 加载完成..2017-09-05 11:30:11
main> 整个配置 加载完成..2017-09-05 11:30:11

 

© 著作权归作者所有

共有 人打赏支持
pan_1308
粉丝 5
博文 95
码字总数 58819
作品 0
黄冈
私信 提问
读书笔记之《Java并发编程的艺术》-并发编程基础

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

Hi徐敏
2015/11/11
0
8
Java 多线程编程总结

一、认识多任务、多进程、单线程、多线程 要认识多线程就要从操作系统的原理说起。 以前古老的DOS操作系统(V 6.22)是单任务的,还没有线程的概念,系统在每次只能做一件事情。比如你在cop...

鉴客
2010/12/16
1K
3
Java多线程学习(五)线程间通信知识点补充

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

一只蜗牛呀
2018/04/16
0
0
Java 学习(27)---(多线程 / Runnable 接口 / 调度和优先级)

多线程 1 .概念 多线程:一个应用程序有多条执行路径进程:正在执行的应用程序 线程:进程的执行单元,执行路径 单线程:一个应用程序只有一条执行路径 多线程:一个应用程序有多条执行路径 ...

姜白告
2018/08/03
0
0
Java基础加强之多线程篇 - 线程创建与终止、互斥、通信、本地变量

线程创建与终止 线程创建 Thread类与 Runnable 接口的关系 Thread类与 Runnable接口 都位于java.lang包中。 从上面我们可以看出,Runnable接口中只定义了run()方法,Thread类实现了Runnable ...

Java高级架构师
2018/12/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

IntelliJ IDEA创建第一个Spring boot项目

下载maven:http://maven.apache.org/download.cgi 开发工具:IntelliJ IDEA JDK: Java JDK1.8 ## 1.为了第一个项目初始化速度加快,我们先来配置maven: 添加配置: 选择Build,Execution,Dep...

凌宇之蓝
28分钟前
0
0
Coding and Paper Letter(四十五)

资源整理。 1 Coding: 1.Python库gempy,一种基于Python的开源三维结构地质建模软件,它允许从界面和方向数据隐式(即自动)创建复杂的地质模型。 它还支持随机建模以解决参数和模型的不确定...

胖胖雕
52分钟前
1
0
golang 声明一个指定长度的数组,用于后续添加

很多时候我们需要声明一个指定长度的数组,用于后续添加.在使用go的时候要注意,下面的第一个例子会有报错 "non-constant array bound",应该使用第二个例子. Length 是动态的值 有报错的例子 ...

漫步海边小路
55分钟前
0
0
Java NIO示例

Server端 /** * 《构建高性能的大型分布式Java应用》 * 书中的示例代码 * 版权所有 2008---2009 */package book.chapter1.tcpnio;import java.net.InetSocketAddress;i...

月下狼
今天
0
0
发布xxl-job executor dotnet core 执行器的实现

DotXxlJob [github][https://github.com/xuanye/DotXxlJob] xxl-job的dotnet core 执行器实现,支持XXL-JOB 2.0+ 1 XXL-JOB概述 [XXL-JOB][1]是一个轻量级分布式任务调度平台,其核心设计目标...

假正经哥哥
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部