一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java并發編程示例(六):等待線程執行終止

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

2019-12-06 14:09junjie 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());
    }
}

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 色综合久久最新中文字幕 | 暖暖的视频完整视频韩国免费 | 四虎最新免费网址 | 亚欧洲乱码视频一二三区 | 欧美精品久久一区二区三区 | 美女禁18| 被巨大黑人的翻白眼 | 艾秋麻豆果冻剧传媒在线播放 | 国产盗摄wc女厕所 | 欧美亚洲影院 | 国产一级真人毛爱做毛片 | 好妈妈7在线观看高清 | jiizz亚洲护士厕所 | voyeur多毛厕所 | 久久综久久美利坚合众国 | 国产精品高清视亚洲一区二区 | 手机免费在线视频 | 二次元美女挤奶漫画 | 精品国产精品人妻久久无码五月天 | 精品无码久久久久久久久 | 欧美激情精品久久久久久不卡 | 美女的隐私无遮挡撒尿 | 青青草99久久精品国产综合 | 精品欧美日韩一区二区三区 | 美女靠逼免费视频 | 大学第一次基本都没了 | 日本连裤袜xxxxx在线视频 | 免费一级生活片 | 91麻豆精品国产自产在线观看 | 九九精品视频在线免费观看 | 幻女free性俄罗斯第一次摘花 | 国产资源视频在线观看 | 翁熄性放纵交换01 | 丝袜足液精子免费视频 | 青青在线观看 | 国产精品国语自产拍在线观看 | 性色欲情网站IWWW | 饭冈加奈子在线播放观看 | 红杏劫 | bbbbbbaaaaaa毛片| 国产绿帽|