亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java并發(fā)編程示例(一):線程的創(chuàng)建和執(zhí)行

 更新時(shí)間:2014年12月05日 09:29:43   投稿:junjie  
這篇文章主要介紹了Java并發(fā)編程示例(一):線程的創(chuàng)建和執(zhí)行,本文是系列文章的第一篇,需要的朋友可以參考下

開門見山

在IT圈里,每當(dāng)我們談?wù)摬l(fā)時(shí),必定會(huì)說起在一臺(tái)計(jì)算機(jī)上同時(shí)運(yùn)行的一系列線程。如果這臺(tái)電腦上有多個(gè)處理器或者是一個(gè)多核處理器,那么這時(shí)是實(shí)實(shí)在在的“同時(shí)運(yùn)行”;但是,如果計(jì)算機(jī)只有一個(gè)單核處理器,那么這時(shí)的“同時(shí)運(yùn)行”只是表象而已。

所有的現(xiàn)代操作系統(tǒng)全部支持任務(wù)的并發(fā)執(zhí)行。你可以邊聽音樂,邊上網(wǎng)看新聞,還不耽誤首發(fā)電子郵件。我們可以說,這種并發(fā)是 進(jìn)程級(jí)并發(fā) 。在進(jìn)程內(nèi)部,我也可以看到有許許多多的并發(fā)任務(wù)。我們把運(yùn)行在一個(gè)進(jìn)程里面的并發(fā)任務(wù)稱 線程。

和并發(fā)相關(guān)的另外一個(gè)常見概念是 并行。并發(fā)與并行之間,存在著一些不同,也存在著一些聯(lián)系。一些程序員(Author,竊譯為“程序員”)認(rèn)為,在一個(gè)單核處理器上多線程地執(zhí)行應(yīng)用程序就是并發(fā),并且你可以觀察到程序員的執(zhí)行;另外,當(dāng)你的程序以多線程的形式運(yùn)行在多個(gè)處理器或者是多核處理器上時(shí),就是并行。還有一些程序員認(rèn)為如果應(yīng)用程序的線程沒有按照預(yù)先設(shè)定好的順序執(zhí)行就是并發(fā);為了簡化問題解決方案而是用個(gè)線程,并且這些線程是按照一定順序在執(zhí)行,那么這是并行。

本章將通過十二個(gè)示例來演示如何使用Java7的API來執(zhí)行一些基本的線程操作。你將可以看到,在Java程序中,如何創(chuàng)建、執(zhí)行線程,如何控制線程的執(zhí)行,如何將一組線程作為一個(gè)單元來操縱等等。

在本節(jié),我們將學(xué)習(xí)如何在Java程序中創(chuàng)建線程,以及如何運(yùn)行。在Java程序中,一切皆為 Object ,線程也是如此。創(chuàng)建線程的方式有兩種:

1.繼承Thread類,并且重寫run()方法;
2.創(chuàng)建一個(gè)類,實(shí)現(xiàn)Runnable接口,然后創(chuàng)建一個(gè)Thread類的對(duì)象,然后將實(shí)現(xiàn)Runnable接口的類的實(shí)例作為參數(shù),傳遞給Thread類的實(shí)例。

在本節(jié),我們將使用第二種方式,來創(chuàng)建十個(gè)線程,并且運(yùn)行起來。每個(gè)線程計(jì)算并打印兩個(gè)十以內(nèi)的整數(shù)之積。

知其然

根據(jù)下面所述的步驟來實(shí)現(xiàn)這里例子:

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

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

public class Calculator implements Runnable {

2.聲明一個(gè)私有的整形屬性,名稱為number,實(shí)現(xiàn)該類的構(gòu)造函數(shù)來初始化剛剛聲明的屬性。代碼如下:

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

private int number;

public Calculator(int number) {
    this.number = number;
}


3.實(shí)現(xiàn)run()方法,該方法是我們創(chuàng)建的線程執(zhí)行時(shí)運(yùn)行的程序(instruction),故而該方法用于計(jì)算乘法表。具體代碼如下:
復(fù)制代碼 代碼如下:

@Override
public void run() {
    for (int i = 0; i < 10; i++) {
        System.out.printf("%s: %d * %d = %d\n",
                Thread.currentThread().getName(),
                number, i, i * number);
    }
}

4.現(xiàn)在,是時(shí)候?qū)崿F(xiàn)示例應(yīng)用的主類(main class)了。創(chuàng)建名為Main的類,在該類中添加main方法。代碼如下:
復(fù)制代碼 代碼如下:

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

5.在main()方法內(nèi)部,創(chuàng)建一個(gè)遍歷十次的for循環(huán),在循環(huán)體內(nèi),創(chuàng)建一個(gè)Calculator類的對(duì)象calculator,創(chuàng)建一個(gè)Thread類的對(duì)象thread,將calculator作為構(gòu)造函數(shù)的參數(shù),傳遞給thread的初始化語句。最后,調(diào)用thread對(duì)象的start()方法。代碼如下:
復(fù)制代碼 代碼如下:

for (int i = 0; i < 10; i++) {
    Calculator calculator = new Calculator(i);
    Thread thread = new Thread(calculator);
    thread.start();
}

6.運(yùn)行這個(gè)程序,看不同線程是如何并發(fā)執(zhí)行的。

知其所以然

下面是運(yùn)行程序時(shí),控制臺(tái)打印出來的的一段輸出,我們可以看到我們創(chuàng)建的所有線程都在并發(fā)執(zhí)行。

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

Thread-3: 3 * 5 = 15
Thread-0: 0 * 2 = 0
Thread-3: 3 * 6 = 18
Thread-1: 1 * 6 = 6
Thread-1: 1 * 7 = 7
Thread-3: 3 * 7 = 21
Thread-3: 3 * 8 = 24
Thread-0: 0 * 3 = 0
Thread-0: 0 * 4 = 0
Thread-3: 3 * 9 = 27
Thread-1: 1 * 8 = 8

所有的Java程序最少執(zhí)行一個(gè)線程。當(dāng)我們運(yùn)行Java程序時(shí),Java虛擬機(jī)(以后稱為JVM)會(huì)運(yùn)行一個(gè)線程,調(diào)用含有main()方法的程序。

當(dāng)調(diào)用Thread對(duì)象的start()方法時(shí),就會(huì)創(chuàng)建另外一個(gè)線程。調(diào)用多少次start()方法,就會(huì)創(chuàng)建多少個(gè)線程。

當(dāng)所有線程執(zhí)行完成后,Java程序會(huì)隨之終止。(非特殊情況下,是所有非后臺(tái)(non-daemon)線程執(zhí)行完成)當(dāng)啟動(dòng)線程(例如執(zhí)行main()方法的線程)終止后,其余線程會(huì)繼續(xù)執(zhí)行直到完成計(jì)算任務(wù)。當(dāng)其中一個(gè)線程調(diào)用System.exit(),請(qǐng)求JVM中止程序時(shí),所有線程中止其執(zhí)行。

調(diào)用Thread對(duì)象的run()方法時(shí),不會(huì)創(chuàng)建線程;同樣,調(diào)用實(shí)現(xiàn)Runnable接口的類run()方法時(shí),也不會(huì)創(chuàng)建線程。只有調(diào)用Thread對(duì)象的start()方法時(shí),才會(huì)創(chuàng)建線程。

永無止境

正如本節(jié)開頭所說,還有另外一種創(chuàng)建線程的方法:繼承Thread類,重寫run()方法,這樣,就可以創(chuàng)建一個(gè)Thread子類的對(duì)象,然后調(diào)用該對(duì)象的start()方法來創(chuàng)建線程。

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

因?yàn)闇?zhǔn)備面試,找來一堆Java多線程方面的資料,其中包括這本《Java 7 Concurrency Cookbook》,講解的非常淺顯易懂,非常適合對(duì)多線程了解不多,又想認(rèn)真學(xué)習(xí)一下的朋友。找了找,沒找到中文版,干脆自己動(dòng)手豐衣足食。所以,計(jì)劃出一個(gè)非官方翻譯版,書名暫時(shí)定為 《Java7并發(fā)示例集》。

拿來主義

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

小有所成

原書沒有完整代碼,不利于查看。所以,D瓜哥加了一個(gè)小節(jié),專門展示本節(jié)所示的完整版代碼。

Calculator類的完整代碼

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

package com.diguage.books.concurrencycookbook.chapter1.recipe1;

/**
 * Date: 2013-09-13
 * Time: 21:42
 */
public class Calculator implements Runnable {
    private int number;

    public Calculator(int number) {
        this.number = number;
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.printf("%s: %d * %d = %d\n",
                    Thread.currentThread().getName(),
                    number, i, i * number);
        }
    }
}

Main類的完整代碼

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

package com.diguage.books.concurrencycookbook.chapter1.recipe1;

/**
 * Date: 2013-09-13
 * Time: 19:46
 */
public class Main {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            Calculator calculator = new Calculator(i);
            Thread thread = new Thread(calculator);
            thread.start();
        }
    }
}

相關(guān)文章

  • 淺談Java自定義注解相關(guān)知識(shí)

    淺談Java自定義注解相關(guān)知識(shí)

    今天帶大家來學(xué)習(xí)Java注解的相關(guān)知識(shí),文中對(duì)自定義注解作了非常詳細(xì)的介紹,對(duì)正在學(xué)習(xí)Java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • RocketMQ消息拉取過程詳解

    RocketMQ消息拉取過程詳解

    這篇文章主要為大家介紹了RocketMQ消息拉取過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 詳解如何全注解方式構(gòu)建SpringMVC項(xiàng)目

    詳解如何全注解方式構(gòu)建SpringMVC項(xiàng)目

    這篇文章主要介紹了詳解如何全注解方式構(gòu)建SpringMVC項(xiàng)目,利用Eclipse構(gòu)建SpringMVC項(xiàng)目,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2018-10-10
  • Java全面講解順序表與鏈表的使用

    Java全面講解順序表與鏈表的使用

    大家好,今天給大家?guī)淼氖琼樞虮砗玩湵?,我覺得順序表還是有比較難理解的地方的,于是我就把這一塊的內(nèi)容全部整理到了一起,希望能夠給剛剛進(jìn)行學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的人帶來一些幫助,或者是已經(jīng)學(xué)過這塊的朋友們帶來更深的理解,我們現(xiàn)在就開始吧
    2022-05-05
  • 使用Spring由構(gòu)造方法自動(dòng)裝配

    使用Spring由構(gòu)造方法自動(dòng)裝配

    這篇文章主要介紹了使用Spring由構(gòu)造方法自動(dòng)裝配,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • java判斷對(duì)象中某個(gè)屬性是否為空方法代碼

    java判斷對(duì)象中某個(gè)屬性是否為空方法代碼

    這篇文章主要給大家介紹了關(guān)于java判斷對(duì)象中某個(gè)屬性是否為空的相關(guān)資料,最近遇到后臺(tái)接收值的時(shí)候,需要對(duì)接收對(duì)象進(jìn)行非空校驗(yàn),需要的朋友可以參考下
    2023-07-07
  • 解決Jenkins集成SonarQube遇到的報(bào)錯(cuò)問題

    解決Jenkins集成SonarQube遇到的報(bào)錯(cuò)問題

    本文給大家分享Jenkins集成SonarQube遇到的報(bào)錯(cuò)問題及解決方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-07-07
  • Spring Boot項(xiàng)目利用Redis實(shí)現(xiàn)session管理實(shí)例

    Spring Boot項(xiàng)目利用Redis實(shí)現(xiàn)session管理實(shí)例

    本篇文章主要介紹了Spring Boot項(xiàng)目利用Redis實(shí)現(xiàn)session管理實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • java自定義Scanner類似功能類的實(shí)例講解

    java自定義Scanner類似功能類的實(shí)例講解

    這篇文章主要介紹了java自定義Scanner類似功能類的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • java中的?HashMap?的加載因子是0.75原理探討

    java中的?HashMap?的加載因子是0.75原理探討

    在Java中,HashMap是一種常用的數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)鍵值對(duì),它的設(shè)計(jì)目標(biāo)是提供高效的插入、查找和刪除操作,在HashMap的實(shí)現(xiàn)中,加載因子(Load?Factor)是一個(gè)重要的概念,本文將探討為什么Java中的HashMap的加載因子被設(shè)置為0.75
    2023-10-10

最新評(píng)論