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

Java線程創(chuàng)建的5種寫法詳解

 更新時間:2026年05月31日 09:32:45   作者:ChaoYLuo  
這段文章詳細(xì)解釋了線程與進(jìn)程的關(guān)系、線程狀態(tài)、線線程創(chuàng)建的幾種寫法、常見面試題以及高耦合與低耦合的概念,通過這些內(nèi)容,讀者可以全面了解線程的基礎(chǔ)知識及其在編程中的應(yīng)用,需要的朋友可以參考下

一、多線程基礎(chǔ)概念

1. 線程與進(jìn)程的關(guān)系

  • 線程是輕量級進(jìn)程,進(jìn)程是重量級進(jìn)程。
  • 進(jìn)程是操作系統(tǒng)資源分配的基本單位,線程是操作系統(tǒng)調(diào)度執(zhí)行的基本單位。
  • 進(jìn)程之間不會相互影響,但線程可能會相互影響(因為線程共享進(jìn)程資源)。
  • 進(jìn)程內(nèi)部包含線程,同一個進(jìn)程的多個線程之間共享同一份資源。
  • 線程創(chuàng)建不需要申請資源,銷毀也不需要釋放資源(相比進(jìn)程開銷?。?。
  • CPU發(fā)展瓶頸 → 多核心(多線程充分利用多核)。

2. 線程狀態(tài):Thread.sleep(millis: 1000)

  • sleep讓當(dāng)前線程進(jìn)入阻塞狀態(tài)(暫停執(zhí)行指定時間)。

3. 方法重寫要求

  • 父類方法和子類方法,簽名完全一致(包括:方法名、參數(shù)列表、聲明的拋出異常...)。

二、線程創(chuàng)建的幾種寫法

寫法1:繼承Thread,重寫run

class MyThread extends Thread {
    @Override
    public void run() {
        while (true) {
            System.out.println("hello thread");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

寫法2:實現(xiàn)Runnable,搭配Thread執(zhí)行

// 1. 定義 Runnable 實現(xiàn)類
class MyRunnable implements Runnable {
    @Override
    public void run() {
        while (true) {
            System.out.println("hello thread");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

// 2. 創(chuàng)建線程
public class Demo3 {
    public static void main(String[] args) throws InterruptedException {
        MyRunnable r = new MyRunnable();
        Thread t = new Thread(r);
        t.start(); // 啟動新線程,執(zhí)行 Runnable 內(nèi)部的 run
        
        while (true) {
            System.out.println("hello main");
            Thread.sleep(1000);
        }
    }
}
  • Runnable自身一般不會單獨執(zhí)行,需要搭配“載體”(Thread)執(zhí)行。
  • 不再需要重寫 run(已實現(xiàn)在 Runnable中)。
  • 本質(zhì):啟動的新線程會執(zhí)行 Runnable內(nèi)部的 run方法。

寫法3:繼承Thread,使用匿名內(nèi)部類

public class Demo3 {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread() {
            @Override
            public void run() {
                while (true) {
                    System.out.println("hello thread");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        };
        t.start(); // 記?。赫{(diào)用 start 才是真正創(chuàng)建線程
        
        while (true) {
            System.out.println("hello main");
            Thread.sleep(1000);
        }
    }
}

步驟:

  1. 創(chuàng)建 Thread的子類(匿名內(nèi)部類,無名字)。
  2. 重寫 run。
  3. 創(chuàng)建 Thread子類的實例,并用 t引用指向。

特點:方便、一次性使用。

寫法4:實現(xiàn)Runnable,使用匿名內(nèi)部類

public class Demo3 {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    System.out.println("hello thread");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        });
        t.start();
        
        while (true) {
            System.out.println("hello main");
            Thread.sleep(1000);
        }
    }
}
  • 此處針對 Runnable定義匿名內(nèi)部類,返回結(jié)果是一個 Runnable的引用,把這個引用傳入 Thread。

寫法5:【簡化】lambda表達(dá)式

public class Demo5 {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
            while (true) {
                System.out.println("hello thread");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        t.start();
        
        while (true) {
            System.out.println("hello main");
            Thread.sleep(1000);
        }
    }
}
  • 數(shù)據(jù)結(jié)構(gòu)角度來看:枚舉、lambda、反射。
  • lambda本質(zhì)上是一個“匿名函數(shù)”,很多地方都能支持。
  • Java 語法非常死板,必須得有類;最初 Java 和其他語言都有 lambda,先搞了個匿名內(nèi)部類過渡。
  • 函數(shù)式接口(如 Runnable是函數(shù)式接口)。

三、常見面試題:Thread對象與start()的關(guān)系

問題:多次調(diào)用start()會怎樣?

public static void main(String[] args) {
    Thread thread = new Thread(() -> {
        System.out.println("hello");
    });
    thread.start();
    thread.start(); // 報錯!
    thread.start();
}
  • 報錯:java.lang.IllegalThreadStateException: Thread already started
  • 原因:Java 約定,一個 Thread對象,和一個操作系統(tǒng)中的線程是“一一對應(yīng)”關(guān)系。
  • 因此,一個 Thread對象,只能 start一次。
  • 后續(xù)學(xué)習(xí) Thread上的其他方法/屬性,都是控制這個對應(yīng)系統(tǒng)中的線程。

四、補(bǔ)充:高耦合 vs 低耦合(生活類比)

  • 高耦合:女朋友生病了,我推掉所有工作,全身心在醫(yī)院照顧 → 假設(shè)陌生人生病了,對我沒啥影響,朋友圈點贊之交,該干啥干啥,影響非常小。
  • 低耦合:任務(wù)(Runnable)和線程(Thread)解耦 → 任務(wù)和線程概念綁定(繼承 Thread)時,若改成其他形式,需要大規(guī)模修改代碼;而 Runnable沒有和線程概念綁定,任務(wù)可方便地遷移到其他載體上。

五、包(package)的概念

  • Java 中類太多(標(biāo)準(zhǔn)庫、第三方庫、自己寫的)→ 亂。
  • 包:一組有關(guān)系的類放到一起
  • 包默認(rèn)情況下不會引入到代碼中,使當(dāng)前代碼引入的類比較少、不容易亂。
  • import java.util.*;:導(dǎo)入包中所有類(不推薦)。
  • 最基礎(chǔ)常用的:import java.lang.*(默認(rèn)導(dǎo)入)。

以上就是Java線程創(chuàng)建的5種寫法詳解的詳細(xì)內(nèi)容,更多關(guān)于Java線程創(chuàng)建寫法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringMVC中redirect重定向(帶參數(shù))的3種方式

    SpringMVC中redirect重定向(帶參數(shù))的3種方式

    Spring MVC中做form表單功能提交時,防止用戶客戶端后退或者刷新時重復(fù)提交問題,需要在服務(wù)端進(jìn)行重定向跳轉(zhuǎn),本文主要介紹了SpringMVC中redirect重定向(帶參數(shù))的3種方式,感興趣的可以了解一下
    2024-07-07
  • Java日期時間使用方法匯總

    Java日期時間使用方法匯總

    這篇文章主要針對Java日期時間使用方法進(jìn)行匯總,感興趣的朋友可以參考一下
    2016-03-03
  • Java平臺調(diào)試體系原理分析和實踐整理 遠(yuǎn)程Debug

    Java平臺調(diào)試體系原理分析和實踐整理 遠(yuǎn)程Debug

    這篇文章主要介紹了Java平臺調(diào)試體系原理分析和實踐整理 遠(yuǎn)程Debug,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • SpringMVC實現(xiàn)文件上傳與下載、攔截器、異常處理器等功能

    SpringMVC實現(xiàn)文件上傳與下載、攔截器、異常處理器等功能

    這篇文章主要給大家介紹了關(guān)于SpringMVC實現(xiàn)文件上傳與下載、攔截器、異常處理器等功能的相關(guān)資料,這些功能在我們?nèi)粘i_發(fā)中經(jīng)常會遇到,本文通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-09-09
  • mybatis動態(tài)新增(insert)和修改(update)方式

    mybatis動態(tài)新增(insert)和修改(update)方式

    這篇文章主要介紹了mybatis動態(tài)新增(insert)和修改(update)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • springboot中設(shè)置定時任務(wù)的三種方法小結(jié)

    springboot中設(shè)置定時任務(wù)的三種方法小結(jié)

    在我們開發(fā)項目過程中,經(jīng)常需要定時任務(wù)來幫助我們來做一些內(nèi)容,本文介紹了springboot中設(shè)置定時任務(wù)的三種方法,主要包括@Scheduled注解,Quartz框架和xxl-job框架的實現(xiàn),感興趣的可以了解一下
    2023-12-12
  • java制作復(fù)制文件工具代碼分享

    java制作復(fù)制文件工具代碼分享

    如果目標(biāo)位置沒有同名文件,則直接拷貝過去;如果目標(biāo)位置已有同名文件,則比對文件的最后修改日期,來進(jìn)行覆蓋或者忽略。程序會在可以在復(fù)制過程中自動創(chuàng)建目錄,并生成log文件,創(chuàng)建了哪些目錄、文件,覆蓋了哪些文件、跳過了哪些文件,文件的時間、位置等信息都一目了然
    2014-01-01
  • Java redisTemplate阻塞式處理消息隊列

    Java redisTemplate阻塞式處理消息隊列

    用redis中的List可以實現(xiàn)隊列,這樣可以用來做消息處理和任務(wù)調(diào)度的隊列。因此,本文將主要為大家介紹如何利用redisTemplate處理消息隊列,感興趣的小伙伴可以了解一下
    2021-12-12
  • Spring Boot 聲明式調(diào)用 Feign 從入門到精通實例詳解

    Spring Boot 聲明式調(diào)用 Feign 從入門到精通實例詳解

    這篇文章給大家介紹Spring Boot聲明式調(diào)用Feign從入門到精通實例詳解,本文全面介紹了Feign的使用和配置,涵蓋基礎(chǔ)和高級特性,以及在復(fù)雜場景中的應(yīng)用,感興趣的朋友跟隨小編一起看看吧
    2026-04-04
  • 解讀nacos獲取配置文件的大致過程

    解讀nacos獲取配置文件的大致過程

    這篇文章主要介紹了nacos獲取配置文件的大致過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07

最新評論

汽车| 黄山市| 古蔺县| 乐平市| 云和县| 崇左市| 德惠市| 弥渡县| 梁平县| 资阳市| 安达市| 中宁县| 堆龙德庆县| 三都| 横山县| 罗江县| 长岛县| 大连市| 资阳市| 普兰县| 松滋市| 延边| 扎鲁特旗| 军事| 原平市| 分宜县| 云安县| 柳州市| 米易县| 衡东县| 玉山县| 怀柔区| 陇西县| 天镇县| 宁夏| 赞皇县| 浮山县| 长海县| 黄浦区| 白沙| 蒙山县|