最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java創(chuàng)建線程的七種方法總結(jié)(全網(wǎng)最全面)

 更新時間:2023年05月19日 14:02:33   作者:陳亦康  
線程是Java中的基本執(zhí)行單元,它允許程序在同一時間執(zhí)行多個任務(wù),下面這篇文章主要給大家總結(jié)介紹了關(guān)于Java創(chuàng)建線程的七種方法,文中通過實例代碼將這七種方法介紹的非常詳細(xì),需要的朋友可以參考下

前言

屬于基礎(chǔ)的面試問題,一定要能夠回答全哦~

一、繼承Thread,重寫run方法

通過自定義一個類(這里起名為:MyThread),繼承Thread類,重寫run方法,最后在main方法中new出MyThread實例,調(diào)用這個實例的繼承的Thread類的start方法創(chuàng)建一個線程。

Ps:

1.創(chuàng)建出MyThread實例,并不代表在系統(tǒng)真的創(chuàng)建一個線程,只有調(diào)用start方法時,才創(chuàng)建出一個新的線程,新線程會執(zhí)行run里的邏輯,直到run里邏輯執(zhí)行完,線程就結(jié)束了;

2.運行一次Java程序就啟動了一個進(jìn)程,一個進(jìn)程里至少會有一個線程,這里JVM默認(rèn)創(chuàng)建的線程就是main線程(主線程),main主線程和MyThread創(chuàng)建出來的新線程是“并發(fā)執(zhí)行”的關(guān)系(并發(fā)+并行),也可以理解為同時執(zhí)行,各執(zhí)行各的;

3.直接調(diào)用run并沒有創(chuàng)建線程,只是在原來的線程中執(zhí)行代碼;

代碼如下:

class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("繼承Thread,重寫run方法創(chuàng)建線程");
    }
}
 
public class Main {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();
    }
}

二、實現(xiàn)Runnable接口,重寫run方法

通過自定義一個類(這里起名為:MyRunnable)實現(xiàn)Runnable接口,重寫run方法,最后在main方法new出MyRunnable實例和Thread實例,最后通過start方法創(chuàng)建并啟動線程。

通俗理解:

這里相當(dāng)于把線程要干的活和線程本身分離開了,使用MyRunnable這個自定義的類來表示“線程要完成的任務(wù)”,這樣做的目的就是為了“解耦合”,假設(shè)未來有新的任務(wù)需要線程去執(zhí)行,那么通過這種方式,代碼改動就比較小。

代碼如下:

class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("實現(xiàn)Runnable接口,重寫run方法");
    }
}
 
public class Main {
    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable);
        thread.start();
    }
}

三、使用匿名內(nèi)部類創(chuàng)建 Thread 子類對象

直接創(chuàng)建Thread子類,同時實例化出一個對象,重寫run方法,最后通過start方法創(chuàng)建并啟動線程。

代碼如下:

public class Main {
    public static void main(String[] args) {
        Thread thread = new Thread() {
            @Override
            public void run() {
                System.out.println("使用匿名內(nèi)部類創(chuàng)建 Thread 子類對象");
            }
        };
        thread.start();
    }
}

四、使用匿名內(nèi)部類,實現(xiàn)Runnable接口

通過使用使用匿名內(nèi)部類,實現(xiàn)Runnable接口作為Thread構(gòu)造方法的參數(shù),最后通過start創(chuàng)建并啟動線程;

代碼如下:

public class Main {
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("使用匿名內(nèi)部類,實例Runnable接口作為構(gòu)造參數(shù)");
            }
        });
        thread.start();
    }
}

五、lambda表達(dá)式

lambda本質(zhì)上就是一個“匿名函數(shù)”,()表示函數(shù)的形參,{}表示函數(shù)體,->特殊語法,表示它是lambda表達(dá)式(->是從C++那里抄來的)。

代碼如下:

public class Main {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
           System.out.println("使用lambda表示創(chuàng)建線程");
        });
        thread.start();
    }
}

六、實現(xiàn)Callable接口

通過自定義類(這里起名為:MyCallable),實現(xiàn)Callable接口,重寫call方法(call方法可以理解為線程需要執(zhí)行的任務(wù)),并且?guī)в蟹祷刂?,這個返回表示一個計算結(jié)果,如果無法計算結(jié)果,則引發(fā)Exception異常,如下源碼英文解釋:

接著創(chuàng)建Callable實例,使用FutrueTast類包裝Callable對象,F(xiàn)utureTask是一個包裝器,需要接收Callable實例來創(chuàng)建,并且有兩個構(gòu)造函數(shù),一個參數(shù)只有Callable對象,另一個參數(shù)不僅有Callable對象,還有一個泛型的result參數(shù),詳細(xì)解釋如下源碼:

最后使用FutureTask對象作為Thread的構(gòu)造參數(shù),通過start方法創(chuàng)建并啟動線程;

注意:這里可以用get方法獲取線程執(zhí)行后的返回值。

代碼如下:

class MyCallableTest implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        System.out.println("創(chuàng)建線程:" + Thread.currentThread().getName());
        return 2;
    }
}
 
public class Main {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask<Integer> task = new FutureTask<>(new MyCallableTest());
        Thread thread = new Thread(task);
        thread.start();
        System.out.println("創(chuàng)建線程的返回結(jié)果為:" + task.get());
    }
 
}

七、使用線程池創(chuàng)建線程

在Java中,線程池的本體叫ThreadPoolExecutor,他的構(gòu)造方法寫起來十分麻煩,為了簡化構(gòu)造方法,標(biāo)準(zhǔn)庫就提供了一系列工廠方法,簡化使用;

什么是工廠模式?

工廠模式,將創(chuàng)建產(chǎn)品實例的權(quán)利移交工廠,我們不再通過new來創(chuàng)建我們所需的對象,而是通過工廠來獲取我們需要的產(chǎn)品。降低了產(chǎn)品使用者與使用者之間的耦合關(guān)系;

也就是說這里創(chuàng)建線程池沒有顯式new,而是通過Executors這個靜態(tài)方法newCaChedThreadPool來完成的;

常見用法:

線程池的單純使用很簡單,使用submit方法,把任務(wù)提交到線程池中即可,線程池中會有線程來完成這些任務(wù);

代碼如下:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
public class Pool {
    public static void main(String[] args) {
        ExecutorService pool = Executors.newCachedThreadPool();
        pool.submit(new Runnable() {
            @Override
            public void run() {
                //執(zhí)行業(yè)務(wù)邏輯
                for(int i = 1; i <= 100; i++) {
                    System.out.println("線程:" + Thread.currentThread().getName() + "執(zhí)行了任務(wù)" + i + "~");
                }
            }
        });
        pool.submit(new Runnable() {
            @Override
            public void run() {
                //執(zhí)行業(yè)務(wù)邏輯
                for(int i = 101; i <= 200; i++) {
                    System.out.println("線程:" + Thread.currentThread().getName() + "執(zhí)行了任務(wù)" + i + "~");
                }
            }
        });
        pool.submit(new Runnable() {
            @Override
            public void run() {
                //執(zhí)行業(yè)務(wù)邏輯
                for(int i = 201; i <= 300; i++) {
                    System.out.println("線程:" + Thread.currentThread().getName() + "執(zhí)行了任務(wù)" + i + "~");
                }
            }
        });
    }
}

當(dāng)任務(wù)量達(dá)到一定程度,一個線程忙不過來時,就會發(fā)現(xiàn)其他線程也來幫忙遼~

總結(jié)

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

相關(guān)文章

  • SpringBoot文件上傳大小設(shè)置方式(yml中配置)

    SpringBoot文件上傳大小設(shè)置方式(yml中配置)

    這篇文章主要介紹了SpringBoot文件上傳大小設(shè)置方式(yml中配置),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Spring?Security6.3.x的使用指南與注意事項

    Spring?Security6.3.x的使用指南與注意事項

    Spring?Security?6.3.1基于現(xiàn)代化架構(gòu),提供簡潔配置、增強默認(rèn)安全性和OAuth2.1/OIDC支持,采用LambdaDSL和組件化設(shè)計,涵蓋用戶認(rèn)證、方法級權(quán)限控制及資源服務(wù)器配置,強調(diào)PasswordEncoder、HTTPS、CSRF保護等最佳實踐,下面是Spring?Security?6.3.1?的使用指南,一起學(xué)習(xí)吧
    2025-08-08
  • Java spring AOP基礎(chǔ)

    Java spring AOP基礎(chǔ)

    本篇文章主要介紹了深入理解spring的AOP機制基礎(chǔ)原理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-11-11
  • 帶你入門Java的集合

    帶你入門Java的集合

    Java的集合類型都是對java.util包中Collection接口的繼承,這里我們主要介紹依賴于collection的一些主分支,一起來看一下Java中的collection集合類型總結(jié)
    2021-07-07
  • SpringBoot項目實現(xiàn)日志打印SQL的常用方法(包括SQL語句和參數(shù))

    SpringBoot項目實現(xiàn)日志打印SQL的常用方法(包括SQL語句和參數(shù))

    有時候遇到問題需要根據(jù)我們編寫的SQL進(jìn)行分析,但如果不進(jìn)行一些開發(fā)或者配置的話,這些SQL是不會打印到控制臺的,它們默認(rèn)是隱藏的。下面給大家介紹幾種常用的方法,感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • Java web數(shù)據(jù)可視化實現(xiàn)原理解析

    Java web數(shù)據(jù)可視化實現(xiàn)原理解析

    這篇文章主要介紹了Java web數(shù)據(jù)可視化實現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • SpringBoot+Redis實現(xiàn)數(shù)據(jù)字典的方法

    SpringBoot+Redis實現(xiàn)數(shù)據(jù)字典的方法

    這篇文章主要介紹了SpringBoot+Redis實現(xiàn)數(shù)據(jù)字典的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • SpringBoot配置層級錯誤導(dǎo)致數(shù)據(jù)庫連接失敗的解決方案

    SpringBoot配置層級錯誤導(dǎo)致數(shù)據(jù)庫連接失敗的解決方案

    在SpringBoot項目中,配置文件的層級(prefix)是決定屬性能否被正確解析的核心因素,一個看似微小的縮進(jìn)錯誤,可能導(dǎo)致整個應(yīng)用的數(shù)據(jù)庫連接失敗、服務(wù)啟動異常,本文將通過真實開發(fā)場景復(fù)現(xiàn),來講講SpringBoot配置文件的正確寫法,需要的朋友可以參考下
    2025-06-06
  • springcloud使用profile實現(xiàn)多環(huán)境配置方式

    springcloud使用profile實現(xiàn)多環(huán)境配置方式

    這篇文章主要介紹了springcloud使用profile實現(xiàn)多環(huán)境配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java中使用RediSearch實現(xiàn)高效的數(shù)據(jù)檢索功能

    Java中使用RediSearch實現(xiàn)高效的數(shù)據(jù)檢索功能

    RediSearch是一款構(gòu)建在Redis上的搜索引擎,它為Redis數(shù)據(jù)庫提供了全文搜索、排序、過濾和聚合等高級查詢功能,本文將介紹如何在Java應(yīng)用中集成并使用RediSearch,以實現(xiàn)高效的數(shù)據(jù)檢索功能,感興趣的朋友跟著小編一起來看看吧
    2024-05-05

最新評論

光山县| 万源市| 济宁市| 沁源县| 通渭县| 屏山县| 巴楚县| 抚松县| 兴仁县| 石家庄市| 延长县| 辽阳县| 泽州县| 云龙县| 临夏县| 湖北省| 潞城市| 奉贤区| 开鲁县| 靖边县| 姚安县| 万载县| 新源县| 宣威市| 云梦县| 青冈县| 高陵县| 长沙县| 岢岚县| 陆川县| 水城县| 东阳市| 建昌县| 封开县| 锡林郭勒盟| 兴海县| 岑溪市| 三门峡市| 明光市| 和静县| 怀柔区|