等待线程的终止

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

为了达到这个目的,我们使用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()方法跟第一种相似,只是需要接受毫秒和纳秒两个参数。

时间: 2024-10-28 14:57:29

等待线程的终止的相关文章

JAVA笔记13__创建线程/线程休眠/等待线程终止/线程中断/守护线程

/** * 线程:是进程的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行,一个进程最少有一个进程(单线程程序) * 多线程两种实现方法:1.继承Thread类 2.实现Runnable接口 */ public class Main { public static void main(String[] args) { MyThread t1 = new MyThread(); t1.start(); //启动线程 System.out.println("main"); S

windows核心编程之使用线程APC回调安全退出多个等待线程

前言 程序开发中经常遇到需要这些情况:辅助线程正在等待内核对象的触发,主线程需要强制终止辅助线程.我们常常做的就是使用:TerminateThread来强制终止线程.这样做当然是不太好的,强制终止线程后系统不会销毁此线程的堆栈,长久下去内存泄露问题就会很严重了.线程最安全的退出方式当然还是让它自己返回了.本文主要介绍windows核心编程中介绍的一种安全退出线程方式:使用可等待API等待内核对象触发,添加线程APC回调. API介绍 首先得简单介绍下一个重要的windows API DWORD

java 线程的终止与线程中断

关于线程终止: 1.一般来讲线程在执行完毕后就会进入死亡状态,那该线程自然就终止了. 2.一些服务端的程序,可能在业务上需要,常驻系统.它本身是一个无穷的循环,用于提供服务.那对于这种线程我们该如何结束它呢. 一.线程的终止 在Thread类中JDK给我们提供了一个终止线程的方法stop(); 该方法一经调用就会立即终止该线程,并立即释放对象锁.如果当一个线程执行一半业务而调用了该方法,可能就会产生数据不一致问题. 数据一致性:同一时间点,你在节点A中获取到key1的值与在节点B中获取到key1

等待线程结束

正常环境下等待线程结束 如果需要等待线程结束,就在线程的实例对象上调用join().在管理线程之创建线程最后的例子中,用my_thread.join()代替my_thread.detach()就可以确保在函数终止前.局部变量析构前,线程会终止.在这种情况下,用分开的线程来运行函数就没有什么意义了.因为在等待my_thread终止时,这个线程就不做任何事情了.在实际的工程应用中,要么这个线程做自己的事,要么创建多个线程等待它们结束. join()是简单粗暴的,或者你等待线程终止,或者你不等待.如果

Java 线程的终止-interrupt

Java线程的终止--interrupt 取消/关闭的场景 我们知道,通过线程的start方法启动一个线程后,线程开始执行run方法,run方法运行结束后线程退出,那为什么还需要结束一个线程呢?有多种情况,比如说: 很多线程的运行模式是死循环,比如在生产者/消费者模式中,消费者主体就是一个死循环,它不停的从队列中接受任务,执行任务,在停止程序时,我们需要一种"优雅"的方法以关闭该线程. 在一些图形用户界面程序中,线程是用户启动的,完成一些任务,比如从远程服务器上下载一个文件,在下载过程

并发基础(九) java线程的终止与中断

1.简单了解一下:为何不赞成使用 Thread.stop.Thread.suspend 和 Thread.resume? ??suspend .resume.stop方法分别完成了线程的暂停.恢复.终止的工作.不建议使用原因:是因为这三个方法带来的副作用,如suspend( )方法,调用后,线程就会一直占用资源睡眠,直到调用resume( )恢复后,才可以运行.这样很容易引发死锁.同样,stop( )方法在终结一个线程时不会保证线程的资源正常释放,因此会导致程序可能工作在不确定的状态下. ??线

等待线程结束(join)

很多情况下,线程之间的协作和人与人之间的协作非常相似.一种非常常见的合作方式就是分工合作.以我们非常熟悉的软件开发为例,在一个项目进行时,总是应该有几位号称是"需求分析师"的同事,先对系统的需求和功能点进行整理和总结,然后,以书面形式给出一份需求说明或者类似的参考文档,然后,软件设计师,研发工程师才会一拥而上,进行软件开发.如果缺少需求分析师的工作输出,那么软件研发的难度可能会比较大.因此,作为一名软件研发人员,总是喜欢等待需求分析师完成他应该完成的任务后,才愿意投身工作.简单地说,就

编写多线程代码时,启动线程后等待线程结束方法

在编写多线程代码时,如果主线程结束,那么子线程也会随之结束,如何等待线程结束再往下执行.   等待线程执行完成代码.   线程代码:   package demo; import java.util.concurrent.CountDownLatch; public class NodeSqlThread1 implements Runnable{         private CountDownLatch cdlSync;         public NodeSqlThread1(Coun

挂起起线程与终止线程的区别

Program1 p1 = new Program1(); Thread th = new Thread(new ThreadStart(p1.ThreadRunMethord));//创建一个新的子线程 if (th.ThreadState != ThreadState.Running)//判断子线程未开始时运行 { th.Start();//启动子线程 } Thread.Sleep(1000);//主线程休眠1秒钟 Console.WriteLine("子线程被挂起而暂停"); i