文档章节

等待线程的终止

柳哥
 柳哥
发布于 2015/04/24 23:07
字数 462
阅读 53
收藏 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()方法跟第一种相似,只是需要接受毫秒和纳秒两个参数。

© 著作权归作者所有

共有 人打赏支持
柳哥
粉丝 204
博文 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

没有更多内容

加载失败,请刷新页面

加载更多

大数据教程(7.5)hadoop中内置rpc框架的使用教程

博主上一篇博客分享了hadoop客户端java API的使用,本章节带领小伙伴们一起来体验下hadoop的内置rpc框架。首先,由于hadoop的内置rpc框架的设计目的是为了内部的组件提供rpc访问的功能,并不...

em_aaron
15分钟前
0
0
CentOS7+git+github创建Python开发环境

1.准备CentOS7 (1)下载VMware Workstation https://pan.baidu.com/s/1miFU8mk (2)下载CentOS7镜像 https://mirrors.aliyun.com/centos/ (3)安装CentOS7系统 http://blog.51cto.com/fengyuns......

枫叶云
昨天
1
0
利用ibeetl 实现selectpicker 的三级联动

1. js 直接写在html页面上面,ibeetl 就可以动态地利用后台传上来的model List ,不需要每次点击都要ajax请求后台 2. 使用selectpicker 的时候,除了对selecct option的动态处理后,还需要 $("#...

donald121
昨天
1
0
Android SELinux avc dennied权限问题解决方法

1. 概述 SELinux是Google从android 5.0开始,强制引入的一套非常严格的权限管理机制,主要用于增强系统的安全性。 然而,在开发中,我们经常会遇到由于SELinux造成的各种权限不足,即使拥有“...

TreasureWe
昨天
3
0
阿里云ACP认证详细笔记(一)

ECS--------------------------1.云服务器Elastic Compute Service(ECS)2.Terraform:您可以使用开源工具Terraform来预配和管理ECS资源。Terraform提供一种简单机制,能够将配置文件部署...

啃不动地大坚果
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部