文档章节

等待线程的终止

柳哥
 柳哥
发布于 2015/04/24 23:07
字数 462
阅读 52
收藏 2

在一些情形下,我们必须等待线程的终止。例如,我们的程序在执行其他的任务时,必须先初始化一些必须的资源。可以使用线程来完成这些初始化任务,等待线程终止,再执行程序的其他任务。

为了达到这个目的,我们使用Thread类的join()方法。当一个线程对象的join()方法被调用时,调用它的线程将被挂起,直到这个线程对象完成它的任务。

package concurrency;

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

public class DataSourcesLoader implements Runnable {
    private int second;
    public DataSourcesLoader(int second){
        this.second = second;
    }
    @Override
    public void run() {
        System.out.printf("Beginning data sources loading: %s\n", new Date());
        try {
            TimeUnit.SECONDS.sleep(second);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.printf("Data sources loading has finished:  %s\n", new Date());
    }

    public static void main(String[] args) {
        DataSourcesLoader dsLoader = new DataSourcesLoader(4);
        Thread thread1 = new Thread(dsLoader,"DataSourceThread1");
        DataSourcesLoader dsLoader2 = new DataSourcesLoader(6);
        Thread thread2 = new Thread(dsLoader2,"DataSourceThread2");
        thread1.start();
        thread2.start();
        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.printf("Main: Configuration has been loaded: %s\n", new Date());
    }
}

thread1线程运行结束,thread2线程也运行结束时,主线程对象才会继续运行并且打印出最终的信息。

java提供了另外两种形式的join()方法:

  • join(long milliseconds)

  • join(long millseconds,long nanos)

当一个线程调用其他某个线程的join()方法时,如果使用的是第一种join()方式,那么它不必等到被调用线程运行终止,如果参数指定的毫秒时钟已经到达,它将继续运行。例如,threadA中有这样的代码threadB.join(1000),threadA将挂起运行,直到满足下面两个条件之一:

  • threadB已经运行完成。

  • 时钟已经过去1000毫秒。

当两个条件中的任何一条成立时,join()方法将返回。第二种join()方法跟第一种相似,只是需要接受毫秒和纳秒两个参数。

© 著作权归作者所有

共有 人打赏支持
柳哥
粉丝 203
博文 405
码字总数 347782
作品 0
杭州
技术主管
一张图弄懂java线程的状态和生命周期

上图是一个线程的生命周期状态流转图,很清楚的描绘了一个线程从创建到终止的过程。 这些状态的枚举值都定义在java.lang.Thread.State下 NEW:毫无疑问表示的是刚创建的线程,还没有开始启动...

java技术栈
2017/08/13
0
0
[原创]手把手教你Linux下的多线程设计--Linux下多线程编程详解(二)

本文可任意转载,但必须注明作者和出处。 【原创】手把手教你Linux下的多线程设计(一) --Linux下多线程编程详解 原创作者:Frozen_socker(冰棍) E_mail:dlskyfly@163.com 接下来,再看另两...

gaoshouma
2007/07/06
0
0
详解 ManualResetEvent(转)

原文:http://www.cnblogs.com/li-peng/p/3291306.html 今天详细说一下ManualResetEvent 它可以通知一个或多个正在等待的线程已发生事件,允许线程通过发信号互相通信,来控制线程是否可心访...

老朱教授
2017/10/01
0
0
详解 ManualResetEvent

今天详细说一下ManualResetEvent 它可以通知一个或多个正在等待的线程已发生事件,允许线程通过发信号互相通信,来控制线程是否可心访问资源 当一个线程开始一个活动(此活动必须完成后,其他...

吞吞吐吐的
2017/10/27
0
0
C#读写者线程(用AutoResetEvent实现同步)

本博客(http://blog.csdn.net/livelylittlefish)贴出作者(三二一、小鱼)相关研究、学习内容所做的笔记,欢迎广大朋友指正! C#读写者线程(用AutoResetEvent实现同步) 最近研究C#中的多...

晨曦之光
2012/03/09
110
0

没有更多内容

加载失败,请刷新页面

加载更多

MySQL数据库集群-PXC方案

网盘下载地址 MySQL数据库集群-PXC方案 PXC是开源的MySQL集群技术,如中国移动、阿里巴巴、腾讯、去哪网等企业均采用或者借鉴了PXC解决方案,可见该方案具有极佳的稳定性。本课程将在Linux环...

qq__2304636824
27分钟前
1
0
vue脚手架搭建项目

npm install -g vue-clivue init webpack my-projectcd my-projectnpm run dev

帝子兮
30分钟前
2
0
es6 字符串拓展方法

es6 include();返回Boolean,该字符串是否包含该字符 startWith() 返回Boolean,该字符串开头是否是该字符 endWith() 返回Boolean,该字符串结尾是否是该字符 repeat() 重复该字符串多少次,...

莫西摩西
30分钟前
1
0
Java语言实现word转PDF(10分钟解决)

前言: 经常做OA办公项目的同学一定和我一样被各种线上的office操作整疯了。基本上涉及到Java操作office的时候就会想到POI和openoffice.这两种方案都是需要找各种jar包,然后用里面繁杂的api。...

山里的红杏
32分钟前
1
0
Flask部分源码阅读

Flask主要依赖于Werkzeug和Jinja这两个库,是很简洁的Python Web框架。 Werkzeug 是一个WSGI的工具包,是Flask的核心库。 Jinja 则是一个模板渲染的库,主要负责渲染返回给客户端的html文件。...

Jian_Ming
36分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部