最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java并發(fā)編程示例(六):等待線程執(zhí)行終止

 更新時間:2014年12月05日 10:29:32   投稿:junjie  
這篇文章主要介紹了Java并發(fā)編程示例(六):等待線程執(zhí)行終止,在本節(jié),示例程序演示等待初始化方法完成后,再去執(zhí)行其他任務,需要的朋友可以參考下

在某些場景下,我們必須等待線程執(zhí)行完成才能進行下一步工作。例如,某些程序在開始執(zhí)行之前,需要先初始化一些資源。這時,我們可以啟動一個線程專門來做初始化任務,等到線程任務完成后,再去執(zhí)行其他部分。

為此,Thread類為我們提供了join()方法。當我們使用線程對象調用此方法時,正在掉調用的線程對象將被推遲到被調用對象執(zhí)行完成后再開始執(zhí)行。

在本節(jié),示例程序演示等待初始化方法完成后,再去執(zhí)行其他任務。

知其然

按照下面所示步驟,完成示例程序。

1.創(chuàng)建一個名為DataSourcesLoader的類,并且實現(xiàn)Runnable接口。代碼如下:

復制代碼 代碼如下:

public class DataSourcesLoader implements Runnable {

2.實現(xiàn)run()方法,向控制臺打印出一條信息以說明開始執(zhí)行,然后睡眠4秒鐘,再向控制臺打印一條信息來說明線程執(zhí)行結束。代碼如下:

復制代碼 代碼如下:

@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.創(chuàng)建一個名為NetworkConnectionsLoader的類,并且實現(xiàn)Runnable接口。 實現(xiàn)run()方法,該方法代碼與DataSourcesLoader類的run()方法一樣,只是這個睡眠6秒鐘。

4.實現(xiàn)示例的主類,并且實現(xiàn)main()方法。代碼如下:

復制代碼 代碼如下:

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

5.創(chuàng)建一個DataSourcesLoader對象,以及一個啟動它執(zhí)行的Thread對象。代碼如下:
復制代碼 代碼如下:

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

6.創(chuàng)建一個NetworkConnectionsLoader對象,以及一個啟動它執(zhí)行的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.向控制臺打印一句話,表明程序執(zhí)行結束。代碼如下:
復制代碼 代碼如下:

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

10.運行程序,查看執(zhí)行效果。

知其所以然

當運行這個示例程序時,我們可以看到兩個線程啟動了它們的執(zhí)行。首先,是DataSourcesLoader完成了它的執(zhí)行;然后,是NetworkConnectionsLoader完成了它的執(zhí)行。這時,主線程繼續(xù)它的執(zhí)行,然后向控制臺打印出終止信息。

永無止境

Java提供了另外兩種重載的join()方法:

復制代碼 代碼如下:

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

第一種方式,不會直到被調用完成任務,而是等待參數指定的時間后就開始執(zhí)行;例如,如果thread1調用該方法,thread1.join(1000),當thread1線程滿足如下其中之一的條件就會繼續(xù)執(zhí)行:

1.thread2完成它的執(zhí)行;
2.1000毫秒過后;

當這兩個條件中的其中之一為真時,join()方法就會返回,開始繼續(xù)執(zhí)行原來的任務。

第二種方式的方法和第一種很類似,只是多了一個納秒級的時間參數。

拿來主義

本文是從 《Java 7 Concurrency Cookbook》 (D瓜哥竊譯為 《Java7并發(fā)示例集》 )翻譯而來,僅作為學習資料使用。沒有授權,不得用于任何商業(yè)行為。

小有所成

本節(jié)所用示例代碼的完整版。

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());
    }
}

相關文章

  • Java堆空間爆滿導致宕機的問題分析及解決

    Java堆空間爆滿導致宕機的問題分析及解決

    團隊有一個服務,一直運行的好好的,突然訪問異常了,先是請求超時,然后直接無法訪問,本文將給大家介紹Java堆空間爆滿導致宕機的問題分析及解決,需要的朋友可以參考下
    2024-02-02
  • 詳解Java?POI?excel自定義設置單元格格式

    詳解Java?POI?excel自定義設置單元格格式

    這篇文章主要介紹了Java?POI?excel設置單元格格式,自定義設置,設置單元格格式:來源_formats,更多數據類型從formats里面發(fā)現(xiàn),需要的朋友可以參考下
    2024-01-01
  • java 獲取服務器真實IP的實例

    java 獲取服務器真實IP的實例

    這篇文章主要介紹了java 獲取服務器真實IP的實例的相關資料,這里提供實現(xiàn)方法幫助大家學習理解這部分內容,需要的朋友可以參考下
    2017-08-08
  • 詳解java之redis篇(spring-data-redis整合)

    詳解java之redis篇(spring-data-redis整合)

    本篇文章主要介紹了java之redis篇,主要詳細的介紹了spring-data-redis整合,有興趣的可以了解一下。
    2017-01-01
  • Java數據結構--時間和空間復雜度

    Java數據結構--時間和空間復雜度

    這篇文章主要介紹了java數據結構的時間和空間復雜度,小編覺得這篇文寫的不錯,感興趣的朋友可以了解下,希望能夠給你帶來幫助
    2021-08-08
  • Java泛型機制與反射原理相關知識總結

    Java泛型機制與反射原理相關知識總結

    今天帶大家學習的是關于Java進階的相關知識,文章圍繞著Java泛型機制與反射原理展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 利用Java實現(xiàn)簡單的猜數字小游戲

    利用Java實現(xiàn)簡單的猜數字小游戲

    這篇文章主要為大家詳細介紹了如何利用java語言實現(xiàn)猜數字小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • linux中nohup?java?-jar啟動java項目的步驟

    linux中nohup?java?-jar啟動java項目的步驟

    nohup是一個Unix和Linux命令,用于運行關閉時不會被終止的進程,這篇文章主要給大家介紹了關于linux中nohup?java?-jar啟動java項目的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-08-08
  • java數據結構之二分查找法 binarySearch的實例

    java數據結構之二分查找法 binarySearch的實例

    這篇文章主要介紹了java數據結構之二分查找法 binarySearch的實例的相關資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內容,需要的朋友可以參考下
    2017-10-10
  • springboot?ElasticSearch如何配置自定義轉換器ElasticsearchCustomConversions

    springboot?ElasticSearch如何配置自定義轉換器ElasticsearchCustomConver

    這篇文章主要介紹了springboot?ElasticSearch如何配置自定義轉換器ElasticsearchCustomConversions問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08

最新評論

霍城县| 乌审旗| 卓尼县| 额敏县| 永泰县| 长兴县| 南昌县| 乐都县| 图们市| 南华县| 丰镇市| 鹤岗市| 明溪县| 宜君县| 鄂托克前旗| 景谷| 若尔盖县| 吴旗县| 陈巴尔虎旗| 凯里市| 怀来县| 邳州市| 隆安县| 惠东县| 邓州市| 漳浦县| 安国市| 庆城县| 海口市| 建湖县| 焉耆| 高雄县| 永平县| 张家界市| 平凉市| 武隆县| 常德市| 海安县| 山阳县| 新昌县| 理塘县|