欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java都有哪些創(chuàng)建線程的方法

 更新時(shí)間:2022年05月09日 11:19:57   作者:??Java中文社群????  
這篇文章主要介紹了Java都有哪些創(chuàng)建線程的方法,文章分享Java創(chuàng)建線程得幾種方法及推薦使用哪種方法,下面詳細(xì)內(nèi)容需要的小伙伴可以參考一下

在 Java 中,線程的創(chuàng)建方法有 7 種,分為以下 3 大類(lèi):

  • 繼承 Thread 類(lèi)的方式,它有 2 種實(shí)現(xiàn)方法。
  • 實(shí)現(xiàn) Runnable 接口的方式,它有 3 種實(shí)現(xiàn)方法。
  • 實(shí)現(xiàn) Callable 接口的方式,它有 2 種實(shí)現(xiàn)方法。

1.繼承Thread類(lèi)

繼承 Thread 類(lèi)并重寫(xiě) run 方法,是最早期創(chuàng)建線程的方法,它的實(shí)現(xiàn)方法有以下兩種:

  • 創(chuàng)建一個(gè)普通的類(lèi),繼承 Thread 類(lèi),并重寫(xiě) run 方法。
  • 使用匿名內(nèi)部類(lèi)的方式繼承并重寫(xiě) run 方法。

具體實(shí)現(xiàn)如下。

1.1 普通類(lèi)繼承Thread

創(chuàng)建一個(gè)普通類(lèi),繼承 Thread 并重寫(xiě) run 方法,其中 run 方法中的代碼是線程具體要執(zhí)行的業(yè)務(wù)代碼,實(shí)現(xiàn)如下:

// 自定義一個(gè)類(lèi)繼承 Thread 并重寫(xiě) run 方法
class MyThread extends Thread {
    @Override
    public void run() {
        // 添加業(yè)務(wù)方法...
    }
}
// 創(chuàng)建線程并執(zhí)行
public class ThreadExample {
    public static void main(String[] args) {
        // 創(chuàng)建線程
        Thread thread = new MyThread();
        // 啟動(dòng)線程
        thread.start();
    }
}

1.2 匿名內(nèi)部類(lèi)

上面的寫(xiě)法有點(diǎn)繁瑣,我們還可以使用以下匿名類(lèi)的方式來(lái)實(shí)現(xiàn):

// 匿名方式創(chuàng)建線程
Thread t1 = new Thread() {
    @Override
    public void run() {
        // 添加業(yè)務(wù)方法...
    }
};
// 啟動(dòng)線程
t1.start();

1.3 缺點(diǎn)分析

繼承 Thread 類(lèi)的實(shí)現(xiàn)方法有一個(gè)明顯的缺點(diǎn),Java 語(yǔ)言是單繼承的,所以如果繼承了 Thread 類(lèi),那就不能再繼承其他類(lèi)了。

2.實(shí)現(xiàn)Runnable接口

在 Java 語(yǔ)言中,雖然不能多繼承,但可以實(shí)現(xiàn)多個(gè)接口。接下來(lái)是實(shí)現(xiàn) Runnable 接口的 3 種方法:

  • 創(chuàng)建一個(gè)普通類(lèi)實(shí)現(xiàn) Runnable 接口,并重寫(xiě) run 方法。
  • 使用匿名方式創(chuàng)建 Runnable 實(shí)現(xiàn)類(lèi),并重寫(xiě) run 方法。
  • 使用 Lambda 方式創(chuàng)建匿名 Runnable 實(shí)現(xiàn)類(lèi)(JDK 8+)。

2.1 普通類(lèi)實(shí)現(xiàn)Runnable

// 定義一個(gè)普通類(lèi)實(shí)現(xiàn) Runnable 接口
class MyRunnable implements Runnable {
    @Override
    public void run() {
        // 添加業(yè)務(wù)方法...
    }
}
// 線程創(chuàng)建
public static void main(String[] args) {
    // 創(chuàng)建一個(gè) Runnable 實(shí)現(xiàn)類(lèi)
    MyRunnable myRunnable = new MyRunnable();
    // 創(chuàng)建線程
    Thread thread = new Thread(myRunnable);
    // 啟動(dòng)線程
    thread.start();
}

2.2 匿名Runnable實(shí)現(xiàn)類(lèi)

// 匿名 Runnable 實(shí)現(xiàn)類(lèi)
Thread t2 = new Thread(new Runnable() {
    @Override
    public void run() {
        // 添加業(yè)務(wù)方法...
    }
});
// 啟動(dòng)線程
t2.start();

2.3 Lambda創(chuàng)建Runnable

在 JDK 8 之后(包含 JDK 8),我們可以使用 Lambda 表達(dá)式來(lái)創(chuàng)建線程,如下代碼所示:

// 使用 Lambda 匿名 Runnable 方式
Thread t3 = new Thread(() -> {
    // 添加業(yè)務(wù)方法...
});
// 啟動(dòng)線程
t3.start();

從上述代碼可以看出,如果是 JDK 1.8 以上的程序,在不要求獲得線程執(zhí)行結(jié)果的情況下,推薦使用 Lambda 的方式來(lái)創(chuàng)建線程,因?yàn)樗膶?xiě)法足夠簡(jiǎn)潔。

2.4 缺點(diǎn)分析

以上創(chuàng)建線程的方法,都有一個(gè)通用的問(wèn)題:那就是不能獲得線程的執(zhí)行結(jié)果。

3.使用Callable接口

JDK 1.5 中推出的 Callable 接口,解決了之前不能獲得線程執(zhí)行結(jié)果的尷尬它的實(shí)現(xiàn)方法有以下兩種:

  • 創(chuàng)建一個(gè)普通類(lèi)實(shí)現(xiàn) Callable 接口,并重寫(xiě) call 方法。
  • 使用匿名內(nèi)部類(lèi)創(chuàng)建 Callable 的實(shí)現(xiàn)類(lèi),并重寫(xiě) call 方法。

3.1 普通類(lèi)實(shí)現(xiàn)Callable

// 定義普通實(shí)現(xiàn) Callable 接口,返回一個(gè) Integer 類(lèi)型的結(jié)果(當(dāng)然也可以返回其他類(lèi)型的結(jié)果)
class MyCallable implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        // 業(yè)務(wù)實(shí)現(xiàn)代碼...
        return 0;
    }
}
// 創(chuàng)建線程
public static void main(String[] args) throws ExecutionException, InterruptedException {
    // 創(chuàng)建 Callable 普通類(lèi)
    MyCallable callable = new MyCallable();
    // 使用 FutureTask 用于獲取線程執(zhí)行結(jié)果
    FutureTask<Integer> futureTask = new FutureTask<>(callable);
    // 創(chuàng)建線程
    Thread thread = new Thread(futureTask);
    // 啟動(dòng)線程
    thread.start();
    // 得到線程執(zhí)行的結(jié)果
    int result = futureTask.get();
}

以上代碼使用 FutureTask + Callable 的方式獲取線程的執(zhí)行結(jié)果,它可以接受任何類(lèi)型的返回值,我們只需要在創(chuàng)建 Callable 實(shí)現(xiàn)類(lèi)的時(shí)候,定義返回的數(shù)據(jù)類(lèi)型即可。

3.2 匿名Callable實(shí)現(xiàn)類(lèi)

// FutureTask 用于獲取線程執(zhí)行結(jié)果
FutureTask<Integer> futureTask = new FutureTask<>(new Callable<Integer>() {
    @Override
    public Integer call() throws Exception {
        // 業(yè)務(wù)代碼...
        return 0;
    }
});
// 創(chuàng)建線程
Thread thread = new Thread(futureTask);
// 啟動(dòng)線程
thread.start();
// 得到線程執(zhí)行的結(jié)果
int result = futureTask.get();

總結(jié)

在 Java 語(yǔ)言中,創(chuàng)建線程有 3 大類(lèi)實(shí)現(xiàn)方式、7 種實(shí)現(xiàn)方法,如果是 JDK 1.8 以上版本,在不需要獲得線程執(zhí)行結(jié)果的情況下,推薦使用 Lambda 方式來(lái)創(chuàng)建線程,因?yàn)樗膶?xiě)法足夠簡(jiǎn)潔;如果想要獲取線程執(zhí)行結(jié)果,可使用 FutureTask + Callable 的方式來(lái)實(shí)現(xiàn)。?

到此這篇關(guān)于Java都有哪些創(chuàng)建線程的方法的文章就介紹到這了,更多相關(guān)Java創(chuàng)建線程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • log4j2異步Logger(詳解)

    log4j2異步Logger(詳解)

    下面小編就為大家?guī)?lái)一篇log4j2異步Logger(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • Mybatis如何通過(guò)接口實(shí)現(xiàn)sql執(zhí)行原理解析

    Mybatis如何通過(guò)接口實(shí)現(xiàn)sql執(zhí)行原理解析

    為了簡(jiǎn)化MyBatis的使用,MyBatis提供了接口方式自動(dòng)化生成調(diào)用過(guò)程,可以大大簡(jiǎn)化MyBatis的開(kāi)發(fā),下面這篇文章主要給大家介紹了關(guān)于Mybatis如何通過(guò)接口實(shí)現(xiàn)sql執(zhí)行原理解析的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • Eclipse不自動(dòng)編譯java文件的終極解決方法

    Eclipse不自動(dòng)編譯java文件的終極解決方法

    這篇文章主要介紹了Eclipse不自動(dòng)編譯java文件的終極解決方法,需要的朋友可以參考下
    2015-12-12
  • SpringData?JPA的常用語(yǔ)法匯總

    SpringData?JPA的常用語(yǔ)法匯總

    Spring Data JPA是Spring基于ORM框架、JPA規(guī)范的基礎(chǔ)上封裝的一套JPA應(yīng)用框架,可使開(kāi)發(fā)者用極簡(jiǎn)的代碼即可實(shí)現(xiàn)對(duì)數(shù)據(jù)的訪問(wèn)和操作,下面這篇文章主要給大家介紹了關(guān)于SpringData?JPA的常用語(yǔ)法,需要的朋友可以參考下
    2022-06-06
  • Java線程休眠之sleep方法詳解

    Java線程休眠之sleep方法詳解

    這篇文章主要介紹了Java線程休眠之sleep方法詳解,Thread?類(lèi)中有一個(gè)靜態(tài)方法的sleep方法,當(dāng)該線程調(diào)用sleep方法后,就會(huì)暫時(shí)讓CPU的調(diào)度權(quán),但是監(jiān)視器資源比如鎖并不會(huì)釋放出去,需要的朋友可以參考下
    2024-01-01
  • java接口Array介紹

    java接口Array介紹

    這篇文章主要介紹了java接口Array的相關(guān)資料,需要的朋友可以參考下
    2014-10-10
  • java文字轉(zhuǎn)語(yǔ)音播報(bào)功能的實(shí)現(xiàn)方法

    java文字轉(zhuǎn)語(yǔ)音播報(bào)功能的實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于java文字轉(zhuǎn)語(yǔ)音播報(bào)功能的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Java高版本Api在Android中的使用方法詳解

    Java高版本Api在Android中的使用方法詳解

    API(Application?Programming?Interface)應(yīng)用程序編程接口,java?API是一本程序員字典,是JDK提供給我們使用的類(lèi)的說(shuō)明文檔,下面這篇文章主要給大家介紹了關(guān)于Java高版本Api在Android中的使用方法,需要的朋友可以參考下
    2022-05-05
  • java代碼實(shí)現(xiàn)mysql分表操作(用戶行為記錄)

    java代碼實(shí)現(xiàn)mysql分表操作(用戶行為記錄)

    這篇文章主要介紹了java代碼實(shí)現(xiàn)mysql分表操作(用戶行為記錄),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • java評(píng)論、回復(fù)功能設(shè)計(jì)與實(shí)現(xiàn)方法

    java評(píng)論、回復(fù)功能設(shè)計(jì)與實(shí)現(xiàn)方法

    很多項(xiàng)目或者系統(tǒng)都有評(píng)論或者回復(fù)的需求,但評(píng)論回復(fù)的實(shí)現(xiàn)往往都比較復(fù)雜,也不好實(shí)現(xiàn),下面這篇文章主要給大家介紹了關(guān)于java評(píng)論、回復(fù)功能設(shè)計(jì)與實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2022-06-06

最新評(píng)論