Java 多线程 - 线程 - 等待线程的终止
博客专区 > pan_1308 的博客 > 博客详情
Java 多线程 - 线程 - 等待线程的终止
pan_1308 发表于5个月前
Java 多线程 - 线程 - 等待线程的终止
  • 发表于 5个月前
  • 阅读 5
  • 收藏 0
  • 点赞 0
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

一、概述

背景需求

      当我们的程序在执行其他的任务时,必须先初始化一些必须的资源。可以使用线程来完成这些初始化任务,等待线程终止,再执行程序的其他任务。为了达到这个目的,可以使用 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

 

标签: 线程 join
共有 人打赏支持
粉丝 4
博文 79
码字总数 57271
×
pan_1308
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: