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

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

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

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

2019-12-06 14:09junjie JAVA教程

這篇文章主要介紹了Java并發(fā)編程示例(六):等待線程執(zhí)行終止,在本節(jié),示例程序演示等待初始化方法完成后,再去執(zhí)行其他任務(wù),需要的朋友可以參考下

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

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

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

知其然

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

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

復(fù)制代碼代碼如下:

public class DataSourcesLoader implements Runnable {

 

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

復(fù)制代碼代碼如下:


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

 

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

復(fù)制代碼代碼如下:

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


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

復(fù)制代碼代碼如下:

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


6.創(chuàng)建一個(gè)NetworkConnectionsLoader對(duì)象,以及一個(gè)啟動(dòng)它執(zhí)行的Thread對(duì)象。代碼如下:

復(fù)制代碼代碼如下:

NetworkConnectionsLoader ncLoader = new NetworkConnectionsLoader();
Thread thread2 = new Thread(ncLoader, "NetworkConnectionsLoader");


7.調(diào)用兩個(gè)Thread對(duì)象的start()方法。代碼如下:

復(fù)制代碼代碼如下:

thread1.start();
thread2.start();


8.調(diào)用join()方法,來等待兩個(gè)線程完成其任務(wù)。這個(gè)方法會(huì)拋出InterruptedException異常,所以要捕獲該異常。代碼如下:

復(fù)制代碼代碼如下:

try {
    thread1.join();
    thread2.join();
} catch (InterruptedException e) {
    e.printStackTrace();
}


9.向控制臺(tái)打印一句話,表明程序執(zhí)行結(jié)束。代碼如下:

復(fù)制代碼代碼如下:

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


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

 

知其所以然

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

永無止境

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

復(fù)制代碼代碼如下:

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

 

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

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

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

第二種方式的方法和第一種很類似,只是多了一個(gè)納秒級(jí)的時(shí)間參數(shù)。

拿來主義

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

小有所成

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

DataSourcesLoader類的完整代碼

復(fù)制代碼代碼如下:


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類的完整代碼

 

復(fù)制代碼代碼如下:


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類的完整代碼

 

復(fù)制代碼代碼如下:


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

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 果冻传媒九一制片厂 | 我与肥熟老妇的性事 | 我强进了老师身体在线观看 | 国产成人8x视频一区二区 | 久久se视频精品视频在线 | 成人影院在线观看免费 | 成人精品mv视频在线观看 | 欧美一级精品 | 国产一卡二卡3卡4卡更新 | 暗卫调教女主肉高h | 国产亚洲福利精品一区 | 草莓秋葵菠萝蜜绿巨人污 | 息与子中文字幕bd | 国产精品模特hd在线 | 国产日韩欧美色视频色在线观看 | 亚洲国产天堂在线观看 | 色综合久久中文字幕 | 福利视频一区青娱 | 亚洲国产精品第一页 | 国产成人性毛片aaww | 国产香蕉97碰碰久久人人 | 成人在线免费观看 | 啊好痛嗯轻一点免费 | 91在线一区二区三区 | 清纯漂亮女友初尝性过程 | 亚洲va欧美va国产综合久久 | 91九色最新地址 | poren黑人| 青草免费在线观看 | 国产v日韩v欧美v精品专区 | 黄网国产| 闺蜜的样子小说安沁在线阅读 | 日本啊v在线观看 | 免费观看日本视频 | 日本片免费观看一区二区 | 97se亚洲国产综合自在线观看 | 91欧美国产 | 午夜精品久久久久久久99蜜桃 | beeg最新| 精品国产免费一区二区三区 | 男人操女人动图 |