线程管理(六)等待线程的终结

简介:

等待线程的终结

在某些情况下,我们需要等待线程的终结。例如,我们可能会遇到程序在执行前需要初始化资源。在执行剩下的代码之前,我们需要等待线程完成初始化任务。

为达此目的, 我们使用Thread 类的join() 方法。当前线程调用某个线程的这个方法时,它会暂停当前线程,直到被调用线程执行完成。

在这个指南中, 我们将学习用初始化例子来使用这个方法。

准备

指南中的例子是使用Eclipse IDE 来实现的。如果你使用Eclipse 或者其他的IDE,例如NetBeans, 打开并创建一个新的java项目。

怎么做呢

按照这些步骤来实现下面的例子::

1.   创建一个类名为 DataSourcesLoader 并一定实现Runnable接口。


1 public class DataSourcesLoader implements Runnable {

2.   实现run()方法。 它写信息来表明它开始运行,然后睡眠4秒,最后再写信息表明它结束运行。


01 @Override
02 public void run() {
03 System.out.printf("Beginning data sources loading: %s\n",new Date());
04 try {
05     TimeUnit.SECONDS.sleep(4);
06 } catch (InterruptedException e) {
07     e.printStackTrace();
08 }
09     System.out.printf("Data sources loading has finished:%s\n",new Date());
10 }

3.   创建一个类名为 NetworkConnectionsLoader 并一定要Runnable接口。实现run()方法。它将与DataSourcesLoader类的run()方法一样,但是它会睡眠6秒。

4.   现在, 创建一个类名为 Main,包含 main()方法。


1 public class Main {
2 public static void main(String[] args) {

5.   创建一个 DataSourcesLoader 类对象并让线程运行它。


1 DataSourcesLoader dsLoader = new DataSourcesLoader(); Thread thread1 = new Thread(dsLoader,"DataSourceThread");

6.    创建一个 NetworkConnectionsLoader 类的对象并让线程运行它。


1 NetworkConnectionsLoader ncLoader = new NetworkConnectionsLoader();
2 Thread thread2 = new Thread(ncLoader,"NetworkConnectionLoad er");

7.    让2个线程对象都调用 start() 方法。


1 thread1.start();
2 thread2.start();

8.   2个线程都使用 join() 方法等待终结。 此方法可以抛出InterruptedException 异常, 所以要包含捕捉代码。


1 try {
2    thread1.join();
3    thread2.join();
4 } catch (InterruptedException e) {
5    e.printStackTrace();
6 }

9.   写一条信息表明程序结束。


1 System.out.printf("Main: Configuration has been loaded: %s\n",new Date());

10. 运行程序并查看结果。

它是怎么工作的

当你运行这个程序时,你可以发现2个线程对象都开始他们的执行。首先, DataSourcesLoader 结束它的运行。然后, NetworkConnectionsLoader 类结束它的运行,同时,主线程对象继续运行并写下了最后的信息。

更多

Java 提供2种形式的 join() 方法:

  • join (long milliseconds)
  • join (long milliseconds, long nanos)

第一种join() 方法, 这方法让调用线程等待特定的毫秒数。例如,如果thread1对象使用代码thread2.join(1000), 那么线程 thread1暂停运行,直到以下其中一个条件发生:

  • thread2 结束运行
  • 1000 毫秒过去了

当其中一个条件为真时,join() 方法返回。

第二个版本的 join() 方法和第一个很像,只不过它接收一个毫秒数和一个纳秒数作为参数。 

目录
相关文章
|
4月前
|
Java C# Python
线程等待(Thread Sleep)
线程等待(Thread Sleep)
|
4月前
|
测试技术
三种等待方式(‌线程等待、‌隐式等待、‌显式等待)
三种等待方式(‌线程等待、‌隐式等待、‌显式等待)
183 4
|
5月前
|
安全 Java
使用notifyAll唤醒所有等待线程
使用notifyAll唤醒所有等待线程
|
4月前
|
安全 Java
使用notifyAll唤醒所有等待线程
使用notifyAll唤醒所有等待线程
|
5月前
|
Java
死锁是线程间争夺资源造成的无限等待现象,Java示例展示了两个线程各自持有资源并等待对方释放,导致死锁。`
【6月更文挑战第20天】死锁是线程间争夺资源造成的无限等待现象,Java示例展示了两个线程各自持有资源并等待对方释放,导致死锁。`volatile`保证变量的可见性和部分原子性,确保多线程环境中值的即时更新。与`synchronized`相比,`volatile`作用于单个变量,不保证原子操作,同步范围有限,但开销较小。`synchronized`提供更全面的内存语义,保证原子性和可见性,适用于复杂并发控制。
41 3
|
5月前
|
Java
使用notifyAll唤醒所有等待线程的方法与比较
使用notifyAll唤醒所有等待线程的方法与比较
|
6月前
|
Java API 分布式数据库
实时计算 Flink版产品使用合集之如何解决 TaskManager和 JobManager中有大量的等待线程
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
104 1
|
6月前
简便的方法开线程干活并且出现等待提示
简便的方法开线程干活并且出现等待提示
35 3
|
6月前
|
安全 算法 关系型数据库
线程安全--深入探究线程等待机制和死锁问题
线程安全--深入探究线程等待机制和死锁问题
167 1
|
6月前
|
存储 开发框架 安全
【C++ 线程】深入理解C++线程管理:从对象生命周期到线程安全
【C++ 线程】深入理解C++线程管理:从对象生命周期到线程安全
427 0