文档章节

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
粉丝 4
博文 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多线程编程总结

今天偶然看到一篇关于Java多线程的精品文章,实在是“爱不释手”,遂转载下来,以供大家参考: [Java多线程编程总结](转自:http://lavasoft.blog.51cto.com/62575/27069) 一、认识多任务、...

晨曦之光
2012/03/09
0
0
Java多线程学习(五)线程间通信知识点补充

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

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

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

姜白告
08/03
0
0
JAVA多线程和并发基础面试问答

原文链接 译文连接 作者:Pankaj 译者:郑旭东 校对:方腾飞 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一。在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢...

雷神雨石
2014/07/19
0
2

没有更多内容

加载失败,请刷新页面

加载更多

码云项目100,水一发

简单回顾一下: 早期构想最多的,是希望能将PHP一些类和编码分区做得更细,所以很多尝试。但不得不说,PHP的功能过于单一,是的,也许写C/C++扩展,可以解决问题,那我为什么不用C#或者Golan...

曾建凯
今天
3
0
Spring应用学习——AOP

1. AOP 1. AOP:即面向切面编程,采用横向抽取机制,取代了传统的继承体系的重复代码问题,如下图所示,性能监控、日志记录等代码围绕业务逻辑代码,而这部分代码是一个高度重复的代码,也就...

江左煤郎
今天
4
0
eclipse的版本

Eclipse各版本代号一览表 Eclipse的设计思想是:一切皆插件。Eclipse核心很小,其它所有功能都以插件的形式附加于Eclipse核心之上。 Eclipse基本内核包括:图形API(SWT/Jface),Java开发环...

mdoo
今天
3
0
SpringBoot源码:启动过程分析(一)

本文主要分析 SpringBoot 的启动过程。 SpringBoot的版本为:2.1.0 release,最新版本。 一.时序图 还是老套路,先把分析过程的时序图摆出来:时序图-SpringBoot2.10启动分析 二.源码分析 首...

Jacktanger
今天
6
0
小白带你认识netty(二)之netty服务端启动(上)

上一章 中的标准netty启动代码中,ServerBootstrap到底是如何启动的呢?这一章我们来瞅下。 server.group(bossGroup, workGroup);server.channel(NioServerSocketChannel.class).optio...

天空小小
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部