文档章节

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并发编程笔记之基础总结(二)

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

狂小白
07/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

造谣造到t-io老巢了

只发当事人的截图,不发表评论,以免有引导嫌疑 PS1:截图是由不同的人发过来的 PS2:本人已经不在此微信群 PS3:图3是2018-09-23的t-io官方群的一个发言小统计,有助于让人认识到他们的其中...

talent-tan
49分钟前
64
0
heartbeat 资源

drbd+apache+heartbeat : http://blog.51cto.com/11838039/1827901 heartbeat双机热备的架设 : http://blog.51cto.com/11838039/1827560 对heaetbeat的深一步认识 : http://blog.51cto.co......

寰宇01
今天
4
0
Spring 转换 model 为 json 时增加属性

缘起 目前的项目中有个需求是在附件对象转换成 json 时增加个 url 属性,以前的方式是在返回附件对象或列表时候做一次统一处理,这次想看看 spring 或者 jackson fasterxml 是否自带类似功能...

郁也风
今天
4
0
10大PHP比特币开源项目

如果你是一个Phper,如果你希望学习区块链,那么本文列出的 10个开源的Php比特币项目,将有助于你了解在自己的应用中 如何加入对比特币的支持。 如果你希望快速掌握使用Php对接比特币钱包的方...

汇智网教程
今天
5
0
springclould feign客户端添加全局参数

用springclould feign作为调用服务的客户端,一般来说参数可以写在feignclient的方法参数里 有时需要所有feign请求都统一添加一些参数,例如token用于鉴权等,可以这样做: 添加一个配置类,...

canneljls
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部