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

Java中Thread類基本用法詳解

 更新時間:2023年06月16日 11:56:42   作者:OAYY  
Java中的Thread類是用于創(chuàng)建和管理線程的類,Thread類提供了許多方法來管理線程,包括啟動線程、中斷線程、暫停線程等,下面這篇文章主要給大家介紹了關(guān)于Java中Thread類基本用法的相關(guān)資料,需要的朋友可以參考下

Thread類的作用

Thread是Java操作多線程最核心的類。

線程創(chuàng)建

Java中創(chuàng)建線程的方法有很多種!?。?/strong>

繼承 Thread, 重寫 run

//繼承Thread類并重寫run方法創(chuàng)建一個線程
class Thread01 extends Thread{
    @Override
    public void run() {
        System.out.println("hello,thread");
    }
}
public class ThreadDemo {
    public static void main(String[] args) {
        //實例化一個線程對象
        Thread01 t=new Thread01();
        //真正去申請系統(tǒng)線程,參與CPU調(diào)度
        t.start();
    }
}

實現(xiàn) Runnable, 重寫 run

//通過繼承Runnable接口并實現(xiàn)run方法
class MyRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println("hello,thread");
    }
}
public class ThreadDemo {
    public static void main(String[] args) {
         //實例化Runnable對象
        MyRunnable runnable=new MyRunnable();
        //實例化線程對象并綁定任務(wù)
        Thread t=new Thread(runnable);
        t.start();
    }
}

繼承 Thread, 重寫 run, 使用匿名內(nèi)部類

 //通過Thread匿名內(nèi)部類的方法創(chuàng)建一個線程
public static void main(String[] args) {
       Thread t=new Thread(){
            //指定線程任務(wù)
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName());
            }
        };
        t.start();
}

實現(xiàn) Runnable, 重寫 run, 使用匿名內(nèi)部類

//通過Runnable匿名內(nèi)部類創(chuàng)建一個線程
   public static void main(String[] args) {
      Thread t=new Thread(new Runnable() {
          //指定線程的任務(wù)
          @Override
          public void run() {
              System.out.println(Thread.currentThread().getName());
          }
      });
      t.start();
   }

使用 lambda 表達式(最推薦)

//通過Lambda表達式的方式創(chuàng)建一個線程
public static void main(String[] args) {
    Thread t=new Thread(()->{
        System.out.println("Hi");
    });
    t.start();
}

上述方法,只是語法規(guī)則不同,本質(zhì)上是一樣的方式,創(chuàng)造出的線程并無不同。

面試題一:請說明Thread類中run和start的區(qū)別
答案:
作用功能不同:
a.run方法的作用是描述線程具體要執(zhí)行的任務(wù);
b.start方法的作用是真正在操作系統(tǒng)內(nèi)核里創(chuàng)建線程,并讓新線程調(diào)用run方法。
運行結(jié)果不同:
a.run方法是一個類中的普通方法,主動調(diào)用和調(diào)用普通方法一樣,會順序執(zhí)行一次。
b.start調(diào)用方法后,start方法內(nèi)部會調(diào)用Java本地方法(封裝了對系統(tǒng)底層的調(diào)用)真正的啟動線程,并執(zhí)行run方法中的代碼,run方法執(zhí)行完成后,線程進入銷毀階段。

線程中斷

中斷的意思不是指讓線程立即就停止,而是通知線程應該要停止,是否真的停止,取決于線程這里具體的代碼寫法。

1.使用標志位來控制線程是否要停止

    public static boolean flag=true;
    public static void main(String[] args) throws InterruptedException {
        Thread t=new Thread(()->{
            while (flag){
                System.out.println("hello Thread");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        t.start();
        Thread.sleep(3000);
        //在主線程里就可以隨時通過flag變量的取值,來操作t線程是否結(jié)束
        flag=false;
    }
  • 自定義變量這種方式不能及時響應,尤其是在sleep休眠的時間比較久的時候。
  • 這個代碼之所以能夠起到修改flag, t線程就結(jié)束,完全取決于 t 線程內(nèi)部的代碼。
  • 代碼里通過flag控制循環(huán)。因此這里只是告訴讓這個線程結(jié)束,這個線程是否要結(jié)束,啥時候結(jié)束,都取決于 t 線程內(nèi)部代碼。

2.使用Thread自帶的標志位來控制線程是否要停止

public static void main(String[] args) throws InterruptedException {
    Thread t=new Thread(()->{
        while (!Thread.currentThread().isInterrupted()){
            System.out.println("hello Thread");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    });
    t.start();
    Thread.sleep(3000);
    t.interrupt();
}

Thread.currentThread():這是Thread類的靜態(tài)方法,通過這個方法可以獲取到當前線程,哪個線程調(diào)用這個方法,就得到哪個線程的對象引用,類似于this。
isInterrupted():判斷線程是否終止,為true表示被終止,為false表示未被終止。
t.interrupt() :在上述代碼中,主線程調(diào)用t.interrupt(),相當于主線程通知 t 線程要終止。

此處interrupt會做兩件事:
1.把線程內(nèi)部的標志位(boolean)給設(shè)置成true。
2.如果線程在進行sleep,就會觸發(fā)異常,把sleep喚醒。
注意:
在喚醒sleep的時候,會把剛才設(shè)置的這個標志位,再設(shè)置回false。(清空了標志位)
這就導致上述代碼在sleep的異常被catch完了之后,循環(huán)還要繼續(xù)執(zhí)行!!
上述代碼執(zhí)行結(jié)果:

問題一:為啥sleep要清除標志位?
喚醒sleep之后,線程到底是否要終止,到底是立即終止還是稍后終止,取決于線程內(nèi)部代碼。

線程等待

線程等待是指一個線程在執(zhí)行過程中暫停自己的運行,并等待其他線程完成一定的操作后再繼續(xù)執(zhí)行。簡單來說,就是控制多個線程的執(zhí)行順序。
線程等待的實現(xiàn)方式有很多種,其中最常見的方式是使用線程的join()方法。當一個線程調(diào)用另一個線程的join()方法時,它會被阻塞,直到被調(diào)用的線程執(zhí)行完畢并退出。

上述代碼執(zhí)行結(jié)果:

總結(jié)

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

相關(guān)文章

  • 利用java+mysql遞歸實現(xiàn)拼接樹形JSON列表的方法示例

    利用java+mysql遞歸實現(xiàn)拼接樹形JSON列表的方法示例

    這篇文章主要給大家介紹了關(guān)于利用java+mysql遞歸實現(xiàn)拼接樹形JSON列表的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面跟著小編來一起看看吧。
    2017-08-08
  • Java利用Sping框架編寫RPC遠程過程調(diào)用服務(wù)的教程

    Java利用Sping框架編寫RPC遠程過程調(diào)用服務(wù)的教程

    這篇文章主要介紹了Java利用Sping框架編寫RPC遠程過程調(diào)用服務(wù)的教程,包括項目管理工具Maven的搭配使用方法,需要的朋友可以參考下
    2016-06-06
  • SpringBoot中如何對actuator進行關(guān)閉

    SpringBoot中如何對actuator進行關(guān)閉

    這篇文章主要介紹了SpringBoot中如何對actuator進行關(guān)閉問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Java?Validated?分組校驗的使用

    Java?Validated?分組校驗的使用

    這篇文章主要介紹了Java?Validated?分組校驗的使用,文章記錄所以在這里記錄下分組校驗注解@Validated的使用,具有一定的參考價值,需要的朋友可以參考一下
    2022-02-02
  • Java虛擬機底層原理詳細分析

    Java虛擬機底層原理詳細分析

    這篇文章主要介紹了Java虛擬機底層原理詳細分析,運行時數(shù)據(jù)區(qū)就是俗稱的虛擬機內(nèi)存,主要包括我們熟悉的堆、棧、本地方法棧、方法區(qū)(元空間)、程序計數(shù)器,虛擬機調(diào)優(yōu)主要針對的是運行時數(shù)據(jù)區(qū),也就是虛擬機內(nèi)存,需要的朋友可以參考下
    2024-01-01
  • idea版本控制忽略.idea文件和.iml文件的問題

    idea版本控制忽略.idea文件和.iml文件的問題

    這篇文章主要介紹了idea版本控制忽略.idea文件和.iml文件,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • IDEA 自動跳出括號的快捷鍵分享

    IDEA 自動跳出括號的快捷鍵分享

    這篇文章主要介紹了IDEA 自動跳出括號的快捷鍵分享,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • java核心編程之文件過濾類FileFilter和FilenameFilter

    java核心編程之文件過濾類FileFilter和FilenameFilter

    這篇文章主要為大家詳細介紹了java文件過濾類FileFilter和FilenameFilter,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • java實現(xiàn)選擇排序算法

    java實現(xiàn)選擇排序算法

    本篇文章介紹直接選擇排序算法的JAVA實現(xiàn)。直接選擇排序算法的基本思想是:n個記錄的文件的直接選擇排序可經(jīng)過n-1趟直接選擇排序得到有序結(jié)果
    2015-04-04
  • Spring+Quartz配置定時任務(wù)實現(xiàn)代碼

    Spring+Quartz配置定時任務(wù)實現(xiàn)代碼

    這篇文章主要介紹了Spring+Quartz配置定時任務(wù)實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04

最新評論