声明:本文是《 Java 7 Concurrency Cookbook 》的第一章, 作者: Javier Fernández González 译者:郑玉婷 校对:方腾飞
等待线程的终结
在某些情况下,我们需要等待线程的终结。例如,我们可能会遇到程序在执行前需要初始化资源。在执行剩下的代码之前,我们需要等待线程完成初始化任务。
为达此目的, 我们使用Thread 类的join() 方法。当前线程调用某个线程的这个方法时,它会暂停当前线程,直到被调用线程执行完成。
在这个指南中, 我们将学习用初始化例子来使用这个方法。
准备
指南中的例子是使用Eclipse IDE 来实现的。如果你使用Eclipse 或者其他的IDE,例如NetBeans, 打开并创建一个新的java项目。
怎么做呢…
按照这些步骤来实现下面的例子::
1. 创建一个类名为 DataSourcesLoader 并一定实现Runnable接口。
public class DataSourcesLoader implements Runnable {
2. 实现run()方法。 它写信息来表明它开始运行,然后睡眠4秒,最后再写信息表明它结束运行。
@Override public void run() { System.out.printf("Beginning data sources loading: %s/n",new Date()); try { TimeUnit.SECONDS.sleep(4); } catch (InterruptedException e) { e.printStackTrace(); } System.out.printf("Data sources loading has finished:%s/n",new Date()); }
3. 创建一个类名为 NetworkConnectionsLoader 并一定要Runnable接口。实现run()方法。它将与DataSourcesLoader类的run()方法一样,但是它会睡眠6秒。
4. 现在, 创建一个类名为 Main,包含 main()方法。
public class Main { public static void main(String[] args) {
5. 创建一个 DataSourcesLoader 类对象并让线程运行它。
DataSourcesLoader dsLoader = new DataSourcesLoader(); Thread thread1 = new Thread(dsLoader,"DataSourceThread");
6. 创建一个 NetworkConnectionsLoader 类的对象并让线程运行它。
NetworkConnectionsLoader ncLoader = new NetworkConnectionsLoader(); Thread thread2 = new Thread(ncLoader,"NetworkConnectionLoad er");
7. 让2个线程对象都调用 start() 方法。
thread1.start(); thread2.start();
8. 2个线程都使用 join() 方法等待终结。 此方法可以抛出InterruptedException 异常, 所以要包含捕捉代码。
try { thread1.join(); thread2.join(); } catch (InterruptedException e) { e.printStackTrace(); }
9. 写一条信息表明程序结束。
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() 方法和第一个很像,只不过它接收一个毫秒数和一个纳秒数作为参数。
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/140911.html