Java並發編程示例(六):期待線程履行終止。本站提示廣大學習愛好者:(Java並發編程示例(六):期待線程履行終止)文章只能為提供參考,不一定能成為您想要的結果。以下是Java並發編程示例(六):期待線程履行終止正文
在某些場景下,我們必需期待線程履行完成能力停止下一步任務。例如,某些法式在開端履行之前,須要先初始化一些資本。這時候,我們可以啟動一個線程專門來做初始化義務,比及線程義務完成後,再去履行其他部門。
為此,Thread類為我們供給了join()辦法。當我們應用線程對象挪用此辦法時,正在失落挪用的線程對象將被推延到被挪用對象履行完成後再開端履行。
在本節,示例法式演示期待初始化辦法完成後,再去履行其他義務。
知其然
依照上面所示步調,完成示例法式。
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()辦法。代碼以下:
public class Main {
public static void main(String[] args) {
5.創立一個DataSourcesLoader對象,和一個啟動它履行的Thread對象。代碼以下:
DataSourcesLoader dsLoader = new DataSourcesLoader();
Thread thread1 = new Thread(dsLoader, "DataSourcesLoader");
6.創立一個NetworkConnectionsLoader對象,和一個啟動它履行的Thread對象。代碼以下:
NetworkConnectionsLoader ncLoader = new NetworkConnectionsLoader();
Thread thread2 = new Thread(ncLoader, "NetworkConnectionsLoader");
7.挪用兩個Thread對象的start()辦法。代碼以下:
thread1.start();
thread2.start();
8.挪用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.運轉法式,檢查履行後果。
知其所以然
當運轉這個示例法式時,我們可以看到兩個線程啟動了它們的履行。起首,是DataSourcesLoader完成了它的履行;然後,是NetworkConnectionsLoader完成了它的履行。這時候,主線程持續它的履行,然後向掌握台打印出終止信息。
永無盡頭
Java供給了別的兩種重載的join()辦法:
join(long milliseconds)
join(long milliseconds, long nanos)
第一種方法,不會直到被挪用完成義務,而是期待參數指定的時光後就開端履行;例如,假如thread1挪用該辦法,thread1.join(1000),當thread1線程知足以下個中之一的前提就會持續履行:
1.thread2完成它的履行;
2.1000毫秒事後;
當這兩個前提中的個中之一為真時,join()辦法就會前往,開端持續履行本來的義務。
第二種方法的辦法和第一種很相似,只是多了一個納秒級的時光參數。
拿來主義
本文是從 《Java 7 Concurrency Cookbook》 (D瓜哥竊譯為 《Java7並發示例集》 )翻譯而來,僅作為進修材料應用。沒有受權,不得用於任何貿易行動。
小有所成
本節所用示例代碼的完全版。
DataSourcesLoader類的完全代碼
package com.diguage.books.concurrencycookbook.chapter1.recipe6;
import java.util.Date;
import java.util.concurrent.TimeUnit;
/**
* Date: 2013-09-19
* Time: 09:15
*/
public class DataSourcesLoader implements Runnable {
@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());
}
}
NetworkConnectionsLoader類的完全代碼
package com.diguage.books.concurrencycookbook.chapter1.recipe6;
import java.util.Date;
import java.util.concurrent.TimeUnit;
/**
* Date: 2013-09-19
* Time: 09:21
*/
public class NetworkConnectionsLoader implements Runnable {
@Override
public void run() {
System.out.printf("Beginning data sources loading: %s\n",
new Date());
try {
TimeUnit.SECONDS.sleep(6);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.printf("Data sources loading has finished: %s\n",
new Date());
}
}
Main類的完全代碼
package com.diguage.books.concurrencycookbook.chapter1.recipe6;
import java.util.Date;
/**
* Date: 2013-09-19
* Time: 09:25
*/
public class Main {
public static void main(String[] args) {
DataSourcesLoader dsLoader = new DataSourcesLoader();
Thread thread1 = new Thread(dsLoader, "DataSourcesLoader");
NetworkConnectionsLoader ncLoader = new NetworkConnectionsLoader();
Thread thread2 = new Thread(ncLoader, "NetworkConnectionsLoader");
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());
}
}