線程管理(六)等待線程的終結

杜老師說 2022-01-07 15:01:18 阅读数:720

管理 等待

聲明:本文是《 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秒,最後再寫信息錶明它結束運行。

@Overridepublic 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() 方法和第一個很像,只不過它接收一個毫秒數和一個納秒數作為參數。

原創文章,轉載請注明: 轉載自並發編程網 – ifeve.com本文鏈接地址: 線程管理(六)等待線程的終結

FavoriteLoading添加本文到我的收藏
版权声明:本文为[杜老師說]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201071501178350.html