文档章节

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

pan_1308
 pan_1308
发布于 2017/09/05 11:31
字数 789
阅读 6
收藏 0
点赞 0
评论 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
博文 94
码字总数 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并发编程笔记之基础总结(二)

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

狂小白
07/17
0
0
JAVA多线程和并发基础面试问答

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

雷神雨石
2014/07/19
0
2
JAVA多线程和并发基础面试问答

多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一。在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题。(校对注:...

LCZ777
2014/05/26
0
0
Java多线程学习(四)等待/通知(wait/notify)机制

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

一只蜗牛呀
04/16
0
0
JAVA多线程和并发基础面试问答

Java多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一...

清风傲剑
2014/12/06
0
0
Java 50道Java线程面试题

不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题。Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎。大多数待遇丰厚的Java开发职位都要求开发者...

swearyd457
2015/08/11
0
0
Java多线程编程要点 (一)

1、 认识Thread和Runnable Java中实现多线程有两种途径:继承Thread类或者实现Runnable接口。Runnable是接口,建议用接口的方式生成线程,因为接口可以实现多继承,况且Runnable只有一个run...

曾赛
2010/04/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Win10专业版安装GIT后使用Git Bash闪退解决办法

百度后把过程和最终解决办法记录下来: 百度首先出来的解决办法如下: 来自:https://segmentfault.com/q/1010000012722511?sort=created 重启电脑 重新安装 安装到C盘 尝试网上的教程 \Git...

特拉仔
18分钟前
0
0
设计模式

1.装饰器模式 概念 允许向一个现有的对象添加新的功能,同时又不改变其结构。装饰者可以在所委托被装饰者的行为之前或之后加上自己的行为,以达到特定的目的。 实现 增加一个修饰类包裹原来的...

EasyProgramming
33分钟前
1
0
用python2和opencv进行人脸识别

一、安装cv2 sudo apt-get install python-opencv opencv-data 二、 Haar特征分类器 Haar特征分类器就是一个XML文件,该文件中会描述人体各个部位的Haar特征值。包括人脸、眼睛、嘴唇等等。 ...

wangxuwei
33分钟前
0
0
python模板中循环字典

{% for k,v in user.items %} {{ k}} {{ v}} {% endfor %}

南桥北木
今天
0
0
Java8系列之重新认识HashMap

简介 Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示: 下面针对各个实现类...

HOT_POT
今天
0
0
获取调用方的className

/** * 获取调用方的class * @return */private static String getInvoke() { StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); S......

iborder
今天
0
0
深入了解一下Redis的内存模型!

一前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分。 我们使用Redis时,会接触Redis的5种对象类型(字符...

Java填坑之路
今天
1
0
从实践出发:微服务布道师告诉你Spring Cloud与Spring Boot他如何选择

背景 随着公司业务量的飞速发展,平台面临的挑战已经远远大于业务,需求量不断增加,技术人员数量增加,面临的复杂度也大大增加。在这个背景下,平台的技术架构也完成了从传统的单体应用到微...

老道士
今天
1
0
大数据学习的各个阶段

第一阶段:Linux课程讲解Linux基础操作,讲的是在命令行下进行文件系统的操作,这是Hadoop学习的基础,后面的所有视频都是基于linux操作的。鉴于很多学员没有linux基础,特增加该内容,保证零linux...

董黎明
今天
0
0
CVE-2013-0077 堆溢出分析

找了很久才发现这个环境比较容易搭建分析... 环境: 系统---Win XP SP3 漏洞程序:QQPlayer 3.7.892.400 出错DLL:quartz.dll 6.5.2600.5512 调试工具:x32db+gflag.exe 过程: 首先gflag设置...

Explorer0
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部