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

Java標準庫中Thread類的基本用法總結大全

 更新時間:2026年01月12日 09:25:16   作者:浪浪山小妖怪!  
Thread類是Java中用于表示線程的類,允許程序并發(fā)執(zhí)行,線程是程序執(zhí)行的最小單位,多個線程可以共享程序的資源,這篇文章主要介紹了Java標準庫中Thread類基本用法的相關資料,需要的朋友可以參考下

前言

線程是操作系統(tǒng)中的概念,操作系統(tǒng)內核實現(xiàn)了線程這樣的概念,并且對用戶層提供了一些api,供用戶使用。在Java標準庫中,Thread
類可以視為是對操作系統(tǒng)提供的api進一步的抽象和封裝。

Thread 類的基本用法有:

一、線程創(chuàng)建

想要實現(xiàn)多線程編程,第一步就是需要創(chuàng)建一個線程。在Java中創(chuàng)建線程的方式有多種方式,下面介紹五種常見的創(chuàng)建方式:

方式1:繼承Thread類,重寫run方法!

  • 創(chuàng)建一個繼承Thread類的子類
  • 重寫run()方法,編寫線程執(zhí)行的代碼
  • 創(chuàng)建子類實例并調用start()方法啟動線程

優(yōu)點:編碼簡單

缺點:Java是單繼承,繼承Thread后無法繼承其他類

class MyThread extends Thread{
    @Override
    public void run() {
        System.out.println("方式1:繼承Thread類,重寫run方法!");
    }
}

//創(chuàng)建對象,并調用start()方法啟動線程
Thread t = new MyThread();
t.start();

方式2:實現(xiàn) Runnable, 重寫 run方法

  • 創(chuàng)建一個實現(xiàn)Runnable接口的類
  • 實現(xiàn)run()方法,編寫線程執(zhí)行的代碼
  • 創(chuàng)建Thread實例,傳入Runnable實現(xiàn)類對象

優(yōu)點:可以繼承其他類,實現(xiàn)多個接口,更靈活

class MyRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println("方式2:實現(xiàn) Runnable, 重寫 run");
    }
}

//創(chuàng)建對象,并調用start()方法啟動線程
Thread t = new Thread(new MyRunnable());
t.start();

方式3: 繼承Thread, 重寫run, 使用匿名內部類

  • 直接創(chuàng)建Thread的匿名子類
  • 在匿名內部類中重寫run()方法
  • 適用于簡單、一次性使用的線程
Thread t = new Thread(){
	@Override
	public void run() {
		System.out.println("方式3:繼承Thread, 重寫run, 使用匿名內部類");
	}
};

方式4: 實現(xiàn)Runnable, 重寫run, 使用匿名內部類

  • 創(chuàng)建Runnable接口的匿名實現(xiàn)類
  • 在匿名內部類中實現(xiàn)run()方法
  • 將匿名Runnable對象傳遞給Thread構造函數(shù)
  • 比繼承Thread的匿名內部類更靈活
Thread t = new Thread(new Runnable() {
	@Override
	public void run() {
		System.out.println("方式4: 實現(xiàn)Runnable, 重寫run, 使用匿名內部類");
	}
});

方式5: 使用lambda表達式

  • Runnable是函數(shù)式接口,可以使用lambda表達式
  • 語法簡潔,適合簡單的線程任務
  • 代碼更簡潔
Thread t = new Thread(()->{
	System.out.println("方式5: 使用lambda表達式");
});

二、線程中斷 - interrupt()

線程一旦啟動進入工作狀態(tài),它就會根據代碼編寫的步驟去執(zhí)行,一直到完成為止才結束。但是有時需臨時打斷它的執(zhí)行,Thread類中提供了interrupt方法去實現(xiàn)這一功能。

interrupt() 是 Thread類的一個實例方法,用于中斷線程。它設置線程的中斷狀態(tài)標志,但不會強制停止線程的執(zhí)行。線程自身需要檢查中斷狀態(tài)并決定如何響應。

thread.interrupt(); // 設置線程的中斷標志位為 true

Thread.interrupted(); // 檢查當前線程是否被中斷(會清除中斷狀態(tài))

thread.isInterrupted(); // 檢查對象關聯(lián)的線程是否被中斷(不會清除中斷狀態(tài))

例如下面代碼實現(xiàn)中斷:

public class Demo3 {
    public static void main(String[] args) throws InterruptedException {
        Thread worker = new Thread(() -> {
           while(!Thread.interrupted()){
               System.out.println("工作中...");
           }
            System.out.println("線程正常結束");
        });

        worker.start();//啟動線程
        Thread.sleep(3000);//讓線程工作三秒
        worker.interrupt(); //中斷線程
    }
}

結果:

我們讓線程工作三秒鐘,此時while循環(huán)每次循環(huán)開始前檢查中斷狀態(tài),當執(zhí)行執(zhí)行中斷指令后,線程結束循環(huán),但線程不會強制停止線程的執(zhí)行,繼續(xù)把線程正常結束語句繼續(xù)打印完后再結束。

另外,如果線程因為調用wait/join/sleep等方法而阻塞掛起,則以InterruptionException異常的形式拋出,中斷狀態(tài)會被清除(變?yōu)?false),如果不重新設置中斷狀態(tài),while 循環(huán)會繼續(xù)執(zhí)行!

所以要在catch后恢復中斷狀態(tài),確保了中斷信號不會丟失,從而讓while 循環(huán)的條件檢查能檢測到中斷,線程就能正常退出。

public class Demo3 {
    public static void main(String[] args) throws InterruptedException {
        Thread worker = new Thread(() -> {
           while(!Thread.currentThread().isInterrupted()){
               System.out.println("工作中...");
               try {
                   Thread.sleep(1000);//sleep() 被中斷時:會拋出 InterruptedException 并清除中斷狀態(tài)(false)
               } catch (InterruptedException e) {
                   System.out.println("線程在sleep時被中斷");
                   Thread.currentThread().interrupt(); //中斷狀態(tài)恢復為true
                                                        //確保了中斷信號不會丟失,
                                                        //確保了while 循環(huán)的條件檢查能檢測到中斷
                                                        //確保了線程能正常退出
               }
           }
            System.out.println("線程正常結束");
        });

        worker.start();//啟動線程
        Thread.sleep(1000);//讓線程工作三秒
        worker.interrupt(); //中斷線程
    }
}

三、線程等待 - join()

有時候,當有多個線程并發(fā)工作時,可能需要某個線程先執(zhí)行完任務后,后一個線程再根據前一個線程執(zhí)行結束的結果去進行自己的下一步工作時,就需要有一個先后執(zhí)行順序,此時可以使用join方法去實現(xiàn)。
栗如:

public class Demo {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.print("1");
            }
        });
        t.start();
        t.join();
        System.out.print("2");
    }
}

當主線程創(chuàng)建一個新線程 t 后,我們調用start方法啟動線程,再調用join方法讓main主線程等待,等打印完 “1” 后,主線程再執(zhí)行打印 “2” 操作,因此最終結果為 “12”。

如果不使用join方法,會出現(xiàn)兩種結果,分別是“12” 或者是“21”。因此t線程和main線程是并發(fā)執(zhí)行的,他們的執(zhí)行順序都是操作系統(tǒng)隨機調度的,為了保證結果為 “12”,就得保證t線程優(yōu)先執(zhí)行,此時就可以調用join方法,使main線程等待。

四、線程休眠 - sleep()

調用sleep方法可以使線程暫時進入休眠狀態(tài),單位為毫秒,比如sleep(3000)就是休眠三秒鐘。

五、獲取線程實例 - currentThread()

返回當前線程對象的引用

例如:

小結

以上就是Java標準庫中Thread類的一些基本用法,由于個人水平有限,如有不足之處,歡迎一起交流學習共同進步!

到此這篇關于Java標準庫中Thread類的基本用法總結大全的文章就介紹到這了,更多相關Java標準庫Thread類用法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 淺談java字符串比較到底應該用==還是equals

    淺談java字符串比較到底應該用==還是equals

    這篇文章主要介紹了淺談java字符串比較到底應該用==還是equals,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • java打jar包的幾種方式詳解

    java打jar包的幾種方式詳解

    這篇文章主要介紹了java打jar包的幾種方式,本文分步驟給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-11-11
  • 以Spring Boot的方式顯示圖片或下載文件到瀏覽器的示例代碼

    以Spring Boot的方式顯示圖片或下載文件到瀏覽器的示例代碼

    這篇文章主要介紹了以Spring Boot的方式顯示圖片或下載文件到瀏覽器的示例代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • 使用chatgpt實現(xiàn)微信聊天小程序的代碼示例

    使用chatgpt實現(xiàn)微信聊天小程序的代碼示例

    這篇文章主要介紹了使用chatgpt實現(xiàn)微信聊天小程序(秒回復),文中有詳細的代碼示例,對大家了解chatgpt聊天有一定的幫助,感興趣的同學可以參考閱讀
    2023-05-05
  • 一文淺析Java中的值傳遞

    一文淺析Java中的值傳遞

    今天在解決一個問題時,程序總是不能輸出正確值,分析邏輯思路沒問題后,發(fā)現(xiàn)原來是由于函數(shù)傳遞導致了這個情況,下面我們就來看看Java中的值傳遞到底是什么情況吧
    2023-08-08
  • Java實現(xiàn)二叉搜索樹的插入、刪除功能

    Java實現(xiàn)二叉搜索樹的插入、刪除功能

    這篇文章主要介紹了Java實現(xiàn)二叉搜索樹的插入、刪除,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • SpringBoot數(shù)據庫初始化datasource配置方式

    SpringBoot數(shù)據庫初始化datasource配置方式

    這篇文章主要為大家介紹了SpringBoot數(shù)據庫初始化datasource配置方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • springBoot無法加載application.properties的問題解決

    springBoot無法加載application.properties的問題解決

    本文介紹了SpringBoot項目中測試類無法讀取application.properties配置文件的問題,詳細記錄了排查過程及解決方案,感興趣的可以了解一下
    2025-07-07
  • springboot集成redis并使用redis生成全局唯一索引ID

    springboot集成redis并使用redis生成全局唯一索引ID

    本文主要介紹了springboot集成redis并使用redis生成全局唯一索引ID,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 關于FileChannel的transferFrom()方法的使用及說明

    關于FileChannel的transferFrom()方法的使用及說明

    這篇文章主要介紹了關于FileChannel的transferFrom()方法的使用及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05

最新評論

中方县| 海盐县| 红河县| 襄垣县| 沙洋县| 长乐市| 多伦县| 平湖市| 宜春市| 濮阳市| 攀枝花市| 石河子市| 于都县| 特克斯县| 蒙阴县| 贵州省| 仁怀市| 屯昌县| 涞水县| 珲春市| 青河县| 中卫市| 卓资县| 金寨县| 大田县| 黎平县| 于田县| 潼南县| 乐昌市| 甘肃省| 武胜县| 深圳市| 桓仁| 卢龙县| 镇原县| 亚东县| 南华县| 来宾市| 霞浦县| 进贤县| 建水县|