国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java多線程 - 創(chuàng)建的三種方式介紹

這篇具有很好參考價(jià)值的文章主要介紹了Java多線程 - 創(chuàng)建的三種方式介紹。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

多線程

多線程簡(jiǎn)介

什么是線程?

線程(thread)是一個(gè)程序內(nèi)部的一條執(zhí)行路徑。

我們之前啟動(dòng)程序執(zhí)行后,main方法的執(zhí)行其實(shí)就是一條單獨(dú)的執(zhí)行路徑。

public static void main(String[] args) {
  	// 代碼...
  	for (int i = 0; i < 10; i++) {
      	System.out.println(i);
		}
  	// 代碼...
}

程序中如果只有一條執(zhí)行路徑,那么這個(gè)程序就是單線程的程序。

什么是多線程?

多線程是指從軟硬件上實(shí)現(xiàn)多條執(zhí)行流程的技術(shù)。

多線程創(chuàng)建

方式一: 繼承Thread類

Thread類:

Java是通過(guò)java.lang.Thread 類來(lái)代表線程的。

按照面向?qū)ο蟮乃枷?,Thread類應(yīng)該提供了實(shí)現(xiàn)多線程的方式。

Thread類創(chuàng)建線程方式:

  1. 定義一個(gè)子類MyThread繼承線程類java.lang.Thread
  2. 子類MyThread中重寫run()方法
  3. 創(chuàng)建MyThread類的實(shí)例對(duì)象
  4. 調(diào)用子線程對(duì)象的start()方法啟動(dòng)線程(啟動(dòng)后還是執(zhí)行run方法的)

Thread類創(chuàng)建多線程示例代碼如下:

public class ThreadDemo {
    public static void main(String[] args) {
        // 3. 創(chuàng)建MyThread類的實(shí)例對(duì)象
        Thread t = new MyThread();
        // 4. 調(diào)用子線程對(duì)象的start方法啟動(dòng)線程(啟動(dòng)后還是執(zhí)行的run方法)
        t.start();

        // 主線程中執(zhí)行的操作
        for (int i = 0; i < 5; i++) {
            System.out.println("主線程執(zhí)行輸出: " + i);
        }
    }
}

/**
    1. 定義一個(gè)線程類繼承自Thread
 */
class MyThread extends Thread {
    /**
        2. 重寫run方法, run方法中定義創(chuàng)建出來(lái)的線程要做什么
     */
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println("子線程執(zhí)行輸出: " + i);
        }
    }
}

Thread類創(chuàng)建多線程的有缺點(diǎn):

優(yōu)點(diǎn):編碼簡(jiǎn)單

缺點(diǎn):線程類已經(jīng)繼承Thread,無(wú)法繼承其他類,不利于擴(kuò)展; 如果線程有執(zhí)行結(jié)果是不可以直接返回的, 意思是重寫的run方法如果是有返回值是沒(méi)辦法獲取到的, 該方式只適合執(zhí)行功能。

上面提到, 調(diào)用start方法啟動(dòng)后還是執(zhí)行的run方法, 那么為什么不直接執(zhí)行run方法呢?

直接調(diào)用run方法會(huì)當(dāng)成普通方法執(zhí)行,此時(shí)相當(dāng)于還是單線程執(zhí)行。

只有調(diào)用start方法才是啟動(dòng)一個(gè)新的線程執(zhí)行。

注意: 不要把主線程執(zhí)行任務(wù)的代碼放在子線程之前, 因?yàn)檫@樣做主線程一直是先跑完的才開(kāi)啟子線程,相當(dāng)于是一個(gè)單線程的效果了。

方式二: 實(shí)現(xiàn)Runnable接口

通過(guò)實(shí)現(xiàn)Runnable接口創(chuàng)建多線程方式如下:

  1. 定義一個(gè)線程任務(wù)類MyRunnable實(shí)現(xiàn)Runnable接口
  2. 任務(wù)類MyRunnable中重寫run()方法
  3. 創(chuàng)建MyRunnable任務(wù)類對(duì)象
  4. 把MyRunnable任務(wù)對(duì)象交給Thread處理。
  5. 調(diào)用線程對(duì)象的start()方法啟動(dòng)線

實(shí)現(xiàn)Runnable接口創(chuàng)建多線程示例代碼:

public class ThreadDemo2 {
    public static void main(String[] args) {
        // 3. 創(chuàng)建MyRunnable 任務(wù)對(duì)象
        Runnable target = new MyRunnable();
        // 4. 把任務(wù)對(duì)象交給線程對(duì)象(Thread)處理
        Thread t = new Thread(target);
        // 5. 啟動(dòng)線程
        t.start();

        // 主線程要執(zhí)行的操作
        for (int i = 0; i < 5; i++) {
            System.out.println("主線程執(zhí)行輸出: " + i);
        }
    }
}

/**
    1. 定義一個(gè)線程任務(wù)類, 實(shí)現(xiàn)Runnable接口
 */
class MyRunnable implements Runnable {
    /**
        2. 任務(wù)類MyRunnable中重寫run方法
     */
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println("子線程執(zhí)行輸出: " + i);
        }
    }
}

實(shí)現(xiàn)Runnable接口創(chuàng)建多線程, 匿名內(nèi)部類的方式簡(jiǎn)化方式一:

public static void main(String[] args) {
    // 1. 創(chuàng)建任務(wù)對(duì)象(匿名內(nèi)部類的方式)
    Runnable target = new Runnable() {
        @Override
        public void run() {
            for (int i = 0; i < 5; i++) {
                System.out.println("子線程執(zhí)行輸出: " + i);
            }
        }
    };
    // 2. 將任務(wù)對(duì)象交給線程對(duì)象(Thread)處理
    Thread t = new Thread(target);
    // 3. 啟動(dòng)線程
    t.start();

    // 主線程執(zhí)行的操作
    for (int i = 0; i < 5; i++) {
        System.out.println("主線程執(zhí)行輸出: " + i);
    }
}

實(shí)現(xiàn)Runnable接口創(chuàng)建多線程, 匿名內(nèi)部類的方式簡(jiǎn)化方式二:

public static void main(String[] args) {
    // 1. 創(chuàng)建任務(wù)對(duì)象(匿名內(nèi)部類的方式)
    // 2. 將任務(wù)對(duì)象交給線程對(duì)象(Thread)處理
    // 3. 啟動(dòng)線程
    new Thread(new Runnable() {
        @Override
        public void run() {
            for (int i = 0; i < 5; i++) {
                System.out.println("子線程執(zhí)行輸出: " + i);
            }
        }
    }).start();

    // 主線程執(zhí)行的操作
    for (int i = 0; i < 5; i++) {
        System.out.println("主線程執(zhí)行輸出: " + i);
    }
}

實(shí)現(xiàn)Runnable接口創(chuàng)建多線程, 匿名內(nèi)部類結(jié)合Lambda表達(dá)式的方式簡(jiǎn)化方式三:

public static void main(String[] args) {
    // 1. 創(chuàng)建任務(wù)對(duì)象(匿名內(nèi)部類的方式)
    // 2. 將任務(wù)對(duì)象交給線程對(duì)象(Thread)處理
    // 3. 啟動(dòng)線程
    new Thread(() -> {
        for (int i = 0; i < 5; i++) {
            System.out.println("子線程執(zhí)行輸出: " + i);
        }
    }).start();

    // 主線程執(zhí)行的操作
    for (int i = 0; i < 5; i++) {
        System.out.println("主線程執(zhí)行輸出: " + i);
    }
}

實(shí)現(xiàn)Runnable接口創(chuàng)建多線程的優(yōu)缺點(diǎn):

優(yōu)點(diǎn):線程任務(wù)類只是實(shí)現(xiàn)接口,可以繼續(xù)繼承類和實(shí)現(xiàn)接口,擴(kuò)展性強(qiáng)。

缺點(diǎn):編程多一層對(duì)象包裝,如果線程有執(zhí)行結(jié)果是拿不到返回結(jié)果的。

方式三: 實(shí)現(xiàn)Callable接口

前兩種線程創(chuàng)建方式都存在一個(gè)問(wèn)題:

他們重寫的run方法均不能直接返回結(jié)果。

不適合需要返回線程執(zhí)行結(jié)果的業(yè)務(wù)場(chǎng)景。

那么如何解決這個(gè)問(wèn)題呢?

JDK 5.0提供了Callable和FutureTask結(jié)合使用來(lái)實(shí)現(xiàn)多線程。

這種實(shí)現(xiàn)多線程方式的優(yōu)點(diǎn)是:可以得到線程執(zhí)行的結(jié)果。

多線程的實(shí)現(xiàn)方案三:利用Callable、FutureTask接口實(shí)現(xiàn), 實(shí)現(xiàn)步驟如下:

① 得到任務(wù)對(duì)象

  • 定義類實(shí)現(xiàn)Callable接口,重寫call方法,call方法中封裝我們要做的事情, 并且call方法是可以返回結(jié)果的。
  • 把Callable任務(wù)對(duì)象交給FutureTask封裝成線程任務(wù)對(duì)象。

② 把線程任務(wù)對(duì)象交給線程對(duì)象(Thread)處理。

③ 調(diào)用Thread的start方法啟動(dòng)線程,執(zhí)行任務(wù)

④ 線程執(zhí)行完畢后、通過(guò)FutureTask的get方法去獲取任務(wù)執(zhí)行的結(jié)果。

使用FutureTask包裝的作用:

作用一: Thread線程對(duì)象構(gòu)造器只接受Runnable類型的對(duì)象, FutureTask是實(shí)現(xiàn)了Runnable接口的, 可以交給Thread處理

作用二: 可以在線程執(zhí)行完畢之后通過(guò)調(diào)用其get方法得到線程執(zhí)行完成的結(jié)果

FutureTask的API

方法名稱 說(shuō)明
FutureTask<>(Callable call) 把Callable對(duì)象封裝成FutureTask對(duì)象。
get() throws Exception 獲取線程執(zhí)行call方法返回的結(jié)果。

演示代碼

public class ThreadDemo4 {
    public static void main(String[] args) {
        // 3. 創(chuàng)建任務(wù)對(duì)象
        Callable<String> callable  = new MyCallable(5);

        // 4. 將任務(wù)對(duì)象包裝成線程任務(wù)對(duì)象
        FutureTask<String> ft = new FutureTask<>(callable);

        // 5. 將線程任務(wù)對(duì)象交給線程對(duì)象(Thread)處理
        Thread t = new Thread(ft);

        // 6. 啟動(dòng)線程
        t.start();

        // 獲取線程執(zhí)行的結(jié)果, 會(huì)返回正常的結(jié)果和異常的結(jié)果
        try {
            String res = ft.get();
            System.out.println(res);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

/**
    1. 定義類實(shí)現(xiàn)Callable接口
    泛型自定義返回值類型
 */
class MyCallable implements Callable<String> {
    private int n;
    public MyCallable(int n) {
        this.n = n;
    }
    /**
        2. 重新實(shí)現(xiàn)類call方法(任務(wù)方法)
     */
    @Override
    public String call() throws Exception {
        int sum = 0;
        for (int i = 1; i <= n ; i++) {
            sum += i;
        }
        return "子線程方法執(zhí)行的結(jié)果是" + sum;
    }
}

方式三的優(yōu)缺點(diǎn):

優(yōu)點(diǎn):線程任務(wù)類只是實(shí)現(xiàn)接口,可以繼續(xù)繼承類和實(shí)現(xiàn)接口,擴(kuò)展性強(qiáng)。

可以在線程執(zhí)行完畢后去獲取線程執(zhí)行的結(jié)果。

缺點(diǎn):編碼會(huì)顯得復(fù)雜一點(diǎn)。

總結(jié): 三種方式對(duì)比如下文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-828301.html

方式 優(yōu)點(diǎn) 缺點(diǎn)
繼承Thread類 編程比較簡(jiǎn)單,可以直接使用Thread類中的方法 擴(kuò)展性較差,不能再繼承其他的類,不能返回線程執(zhí)行的結(jié)果
實(shí)現(xiàn)Runnable接口 擴(kuò)展性強(qiáng),實(shí)現(xiàn)該接口的同時(shí)還可以繼承其他的類。 編程相對(duì)復(fù)雜,不能返回線程執(zhí)行的結(jié)果
實(shí)現(xiàn)Callable接口 擴(kuò)展性強(qiáng),實(shí)現(xiàn)該接口的同時(shí)還可以繼承其他的類??梢缘玫骄€程執(zhí)行的結(jié)果 編程相對(duì)復(fù)雜

到了這里,關(guān)于Java多線程 - 創(chuàng)建的三種方式介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Java 實(shí)現(xiàn)多線程的三種方式

    1、三種方法的介紹和比較 1、1三種方式得介紹 1、繼承Thread類 2、實(shí)現(xiàn)Runnable接口 3、實(shí)現(xiàn)Callable接口 1、2三種方法的介紹和比較 1、2、1、實(shí)現(xiàn)Runnable接口相比繼承Thread類有如下優(yōu)勢(shì) 1、增強(qiáng)程序的健壯性,將業(yè)務(wù)邏輯與線程調(diào)度分離 2、線程池只能放入實(shí)現(xiàn)Runable或Callable類線程

    2024年02月02日
    瀏覽(22)
  • Java創(chuàng)建文件的三種方式

    Java創(chuàng)建文件的三種方式

    內(nèi)容來(lái)自于韓順平學(xué)Java 在學(xué)習(xí)其視頻下跟著編寫 文件創(chuàng)建成功

    2024年04月11日
    瀏覽(22)
  • Java創(chuàng)建數(shù)組的三種方式

    這種一般用的比較多。 數(shù)組類型 [ ]? 數(shù)組名稱? =? new 數(shù)組類型 [ 數(shù)組長(zhǎng)度 ]?

    2024年02月03日
    瀏覽(25)
  • 為Java應(yīng)用創(chuàng)建Docker鏡像的三種方式

    為Java應(yīng)用創(chuàng)建Docker鏡像的三種方式

    在 Dockerfiles 出現(xiàn)的很久之前,Java 開(kāi)發(fā)者大多使用單體應(yīng)用方式部署(WARs, JARs, EARs, 等等)?,F(xiàn)在如你所知,最好的做法是為每個(gè)小業(yè)務(wù)單獨(dú)部署的微服務(wù)方式。你構(gòu)建的不是一個(gè)巨大的單體應(yīng)用程序,而是使多個(gè)可以獨(dú)立運(yùn)行的小服務(wù)。 這正是 Docker 的用武之地。如果你想

    2023年04月26日
    瀏覽(20)
  • 線程創(chuàng)建的三種方式

    線程創(chuàng)建的三種方式

    目錄 1.?Thread類 2.?Runnable接口 3. Callable接口 4. 線程的生命周期 新建? 就緒 運(yùn)行 阻塞 等待 結(jié)束 繼承Thread類的方式創(chuàng)建線程 定義Thread類的子類,并重寫該類的run()方法,該run()方法的方法體就代表了線程需要完成的任務(wù) 創(chuàng)建Thread類的子類,即創(chuàng)建了線程對(duì)象 調(diào)用線程對(duì)象的

    2024年02月09日
    瀏覽(28)
  • C++創(chuàng)建線程的三種方式

    早期的C++并不支持多線程的創(chuàng)建,如果要?jiǎng)?chuàng)建多線程,依賴的是系統(tǒng)提供的一些方法(例如linux的 pthread). 從C++11以后開(kāi)始,提供了std::thread線程庫(kù),因此我們可以創(chuàng)建std::thread類對(duì)象的方式來(lái)創(chuàng)建線程。創(chuàng)建的方式主要有三種: 通過(guò)函數(shù)指針 通過(guò)函數(shù)對(duì)象 通過(guò)lambda函數(shù) 使用

    2024年02月16日
    瀏覽(21)
  • Java創(chuàng)建List 的三種方法

    1.通過(guò) new ArrayList()? 2.? 通過(guò)Arrays.asList() 這種方法構(gòu)造出的List是固定長(zhǎng)度的,如果調(diào)用add方法增加新的元素,會(huì)報(bào)異常,List是由Array轉(zhuǎn)換而來(lái),而Array是不能動(dòng)態(tài)增加長(zhǎng)度的,適合于構(gòu)造靜態(tài)不變List. 3.通過(guò)hutool工具類collectionUtil創(chuàng)建? ?list可以動(dòng)態(tài)添加元素,比較友好,適合

    2024年02月11日
    瀏覽(26)
  • 大家都說(shuō)Java有三種創(chuàng)建線程的方式!并發(fā)編程中的驚天騙局!

    大家都說(shuō)Java有三種創(chuàng)建線程的方式!并發(fā)編程中的驚天騙局!

    在Java中,創(chuàng)建線程是一項(xiàng)非常重要的任務(wù)。線程是一種輕量級(jí)的子進(jìn)程,可以并行執(zhí)行,使得程序的執(zhí)行效率得到提高。Java提供了多種方式來(lái)創(chuàng)建線程,但許多人都認(rèn)為Java有三種創(chuàng)建線程的方式,它們分別是 繼承Thread類、實(shí)現(xiàn)Runnable接口和使用線程池。 但是,你們知道嗎?

    2024年02月08日
    瀏覽(25)
  • 【Java】詳解多線程的概述及三種創(chuàng)建方法

    【Java】詳解多線程的概述及三種創(chuàng)建方法

    ?? 個(gè)人主頁(yè) : Dawn黎明開(kāi)始 ?? 系列專欄 : Java ? 每日一句 : 身在井隅,心向陽(yáng)光,眼里有詩(shī),自在遠(yuǎn)方 ?? 歡迎大家:關(guān)注 ??+ 點(diǎn)贊 ??+評(píng)論 ??+ 收藏?? 文章目錄 一.??多線程 ??前言 1.1??進(jìn)程 1.1.1??什么是進(jìn)程? 1.1.2??多進(jìn)程有什么意義呢? 1.2??線程 1.2.1??什

    2024年02月05日
    瀏覽(23)
  • Java數(shù)組的三種聲明方式

    1.在開(kāi)發(fā)中為什么要使用數(shù)組 如果開(kāi)發(fā)中出現(xiàn)了大量的同一個(gè)類型的數(shù)據(jù),按照現(xiàn)在所學(xué)的知識(shí)點(diǎn),聲明變量的話。如果一個(gè)變量存一個(gè)數(shù)據(jù)的話,那么就會(huì)需要多個(gè)變量了,相當(dāng)麻煩。 使用數(shù)組: 只需要一個(gè)變量,然后數(shù)組中存很多的數(shù)據(jù), 其實(shí)可以把數(shù)組想成 一個(gè)容器

    2024年02月05日
    瀏覽(28)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包