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

Java?Thread.currentThread().getName()?和?this.getName()區(qū)別詳解

 更新時間:2022年02月21日 08:39:42   作者:經(jīng)典雞翅  
本文主要介紹了Thread.currentThread().getName()?和?this.getName()區(qū)別詳解,TestThread?testThread?=?new?TestThread();

currentThread的詳解

currentThread方法是Thread類的一個靜態(tài)方法,用來獲取當前運行的代碼段,正在被哪個線程調(diào)用。我們先來看一眼源碼。

是一個native方法。直接與系統(tǒng)層面做交互。
下面看一段代碼

 public static void main(String[] args) {
        String name = Thread.currentThread().getName();
        System.out.println(name);
    }

輸出的結(jié)果為main。

為什么為main呢?

java的項目在啟動的時候,會創(chuàng)立一個進程,這個進程同樣也是一個線程,在java里面他就叫做main線程。他的名字在設定的時候就是main。我們可以看到上面的代碼就是在main方法下執(zhí)行的,也就是由main線程來執(zhí)行,所以我們打印出來的名字是main。

創(chuàng)建一個新的線程

來看下面的一行代碼,我們創(chuàng)建一個新的線程,并且在線程創(chuàng)建的構(gòu)造方法和其實際執(zhí)行的run方法內(nèi),增加打印出當前執(zhí)行線程的名稱。

public class TestThread extends Thread {

    public TestThread() {
        System.out.println("構(gòu)造方法:" + Thread.currentThread().getName());
    }

    @Override
    public void run() {
        System.out.println("run方法:" + Thread.currentThread().getName());
    }

    public static void main(String[] args) {
        TestThread testThread = new TestThread();
        testThread.start();
    }

}

我們運行一下,看到結(jié)果

構(gòu)造方法:main
run方法:Thread-0

如何理解上述的情況呢?

我們先來看構(gòu)造方法這一行。

TestThread testThread = new TestThread();

這里我們只是聲明了一個線程對象類,這個新的線程沒有創(chuàng)建也沒有啟動,我們僅僅把它理解為一個普通對象即可。那么由于是在main方法里面,那么執(zhí)行他的一定是main線程,所以可以看到構(gòu)造方法輸出的結(jié)果是main。
再來看start方法里面,為什么變成了thread-0了呢。
我們知道java的多線程創(chuàng)建的一種方式就是繼承thread類。然后實現(xiàn)里面的run方法。這樣當線程start的時候,就會調(diào)用內(nèi)部的start0的本地方法,實際就是會執(zhí)行run的實現(xiàn)方法。當run方法執(zhí)行的時候,一定是由我們創(chuàng)建的線程去執(zhí)行的,而不是main線程,所以我們就可以得知打印出來的是新線程的名字thread0。

為什么新線程的名字為thread0呢?

我們是采用繼承thread類的形式來創(chuàng)建線程的,那么在我們構(gòu)造的時候,一定會執(zhí)行父類的構(gòu)造方法。我們是一個空參構(gòu)造,那么我們就要看下父類的空參構(gòu)造是什么樣的??匆幌略创a

可以看到,里面有一個name參數(shù),已經(jīng)給我們拼接了一個thread-后面是加了一個變量,我們繼續(xù)看看這個變量是什么

一個同步的靜態(tài)方法,再來看看變量的值。

一個靜態(tài)的int型變量,由此我們知道int的初始值就是0。我們先獲取到了0然后又執(zhí)行了++。其他線程再次初始化的時候就是從1開始了。因為加了同步鎖的關(guān)鍵字,我們不用害怕數(shù)據(jù)會亂掉。
所以我們就知道了新線程的名字為thread-0的來源。

再看一種帶this的情況

public class TestThread extends Thread {

    public TestThread() {
        System.out.println("構(gòu)造方法開始!");
        System.out.println("構(gòu)造方法:" + Thread.currentThread().getName());
        System.out.println("構(gòu)造方法的this名稱:" + this.getName());
        System.out.println("構(gòu)造方法結(jié)束!");
    }

    @Override
    public void run() {
        System.out.println("run方法開始!");
        System.out.println("run方法:" + Thread.currentThread().getName());
        System.out.println("run方法的this名稱:" + this.getName());
        System.out.println("run方法結(jié)束!");
    }

    public static void main(String[] args) {
        TestThread testThread = new TestThread();
        testThread.start();
    }

}

執(zhí)行的結(jié)果如下:

構(gòu)造方法開始!
構(gòu)造方法:main
構(gòu)造方法的this名稱:Thread-0
構(gòu)造方法結(jié)束!
run方法開始!
run方法:Thread-0
run方法的this名稱:Thread-0
run方法結(jié)束!

我們發(fā)現(xiàn)構(gòu)造的this名稱 為thread-0。這個不難理解,this指的是當前對象的名稱。因為我們的線程在初始化的時候有了name,所以是thread-0。

創(chuàng)建的線程setName的情況

public class TestThread extends Thread {

    public TestThread() {
        System.out.println("構(gòu)造方法開始!");
        System.out.println("構(gòu)造方法:" + Thread.currentThread().getName());
        System.out.println("構(gòu)造方法的this名稱:" + this.getName());
        System.out.println("構(gòu)造方法結(jié)束!");
    }

    @Override
    public void run() {
        System.out.println("run方法開始!");
        System.out.println("run方法:" + Thread.currentThread().getName());
        System.out.println("run方法的this名稱:" + this.getName());
        System.out.println("run方法結(jié)束!");
    }

    public static void main(String[] args) {
        TestThread testThread = new TestThread();
        testThread.setName("test");
        testThread.start();
    }

}

看一下執(zhí)行的結(jié)果

構(gòu)造方法開始!
構(gòu)造方法:main
構(gòu)造方法的this名稱:Thread-0
構(gòu)造方法結(jié)束!
run方法開始!
run方法:test
run方法的this名稱:test
run方法結(jié)束!

這里有人可能就要問了,為啥構(gòu)造方法的this名稱為thread-0。實際run的時候就變?yōu)閠est了呢。
這是因為我們在構(gòu)造對象的時候,對象還不完整,沒有執(zhí)行到setName這一步。所以二者不一致。

最后看一段復雜的代碼

public class TestThread extends Thread {

    public TestThread() {
        System.out.println("構(gòu)造方法開始!");
        System.out.println("構(gòu)造方法:" + Thread.currentThread().getName());
        System.out.println("構(gòu)造方法的this名稱:" + this.getName());
        System.out.println("構(gòu)造方法結(jié)束!");
    }

    @Override
    public void run() {
        System.out.println("run方法開始!");
        System.out.println("run方法:" + Thread.currentThread().getName());
        System.out.println("run方法的this名稱:" + this.getName());
        System.out.println("run方法結(jié)束!");
    }

    public static void main(String[] args) {
        TestThread testThread = new TestThread();
        Thread thread = new Thread(testThread);
        System.out.println("新線程thread的名稱:" + thread.getName());
        thread.setName("test");
        thread.start();
    }

}

可以看到如下的結(jié)果

構(gòu)造方法開始!
構(gòu)造方法:main
構(gòu)造方法的this名稱:Thread-0
構(gòu)造方法結(jié)束!
新線程thread的名稱:Thread-1
run方法開始!
run方法:test
run方法的this名稱:Thread-0
run方法結(jié)束!

我們根據(jù)結(jié)果來看,構(gòu)造方法的打印,和上面解釋的如出一轍。我們重點關(guān)注一下新線程的打印,這里為什么是1呢,因為我們上面初始化0之后已經(jīng)++所以為1。
run方法為test是因為我們實際執(zhí)行的線程Thread thread = new Thread(testThread);所以我們獲取到的名稱是thread的名稱為test。
那么run方法的this名稱為什么是thread-0呢。因為this.getName獲取到的是當前對象的名稱。我們的當前對象是TestThread。他的線程名稱從未被改變過,所以我們拿到了thread-0。

總結(jié)

currentThread的getName代表當前執(zhí)行線程的名稱,this.getName代表對象的名稱。this.getName()實際上返回的是target.getName(),而Thread.currentThread().getName()實際上是thead.getName()。

到此這篇關(guān)于Java Thread.currentThread().getName() 和 this.getName()區(qū)別詳解的文章就介紹到這了,更多相關(guān)Thread.currentThread().getName() 和 this.getName()區(qū)別 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java從零編寫汽車租賃系統(tǒng)全程分析

    Java從零編寫汽車租賃系統(tǒng)全程分析

    這篇文章介紹了Java實現(xiàn)汽車租賃系統(tǒng)的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • SpringBoot排除不需要的自動配置類DataSourceAutoConfiguration問題

    SpringBoot排除不需要的自動配置類DataSourceAutoConfiguration問題

    這篇文章主要介紹了SpringBoot排除不需要的自動配置類DataSourceAutoConfiguration問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Java中的封裝、繼承和多態(tài),你真的都懂了嗎

    Java中的封裝、繼承和多態(tài),你真的都懂了嗎

    Java中的封裝、繼承和多態(tài)知識點是學習java必備的基礎知識,看似簡單,真正理解起來還是有一定難度的,今天小編再次通過實例代碼給大家講解java 封裝繼承多態(tài)知識,感興趣的朋友一起學習下吧
    2021-05-05
  • SpringBoot 多Profile使用與切換方式

    SpringBoot 多Profile使用與切換方式

    這篇文章主要介紹了SpringBoot 多Profile使用與切換方式,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • Mybatis-plus如何在xml中傳入自定義的SQL語句

    Mybatis-plus如何在xml中傳入自定義的SQL語句

    這篇文章主要介紹了Mybatis-plus如何在xml中傳入自定義的SQL語句問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • IDEA如何開啟并配置services窗口

    IDEA如何開啟并配置services窗口

    在使用IntelliJ IDEA時,可能會遇到Services窗口不自動彈出的情況,本文介紹了如何手動開啟Services窗口的簡單步驟,首先,通過點擊菜單欄中的“視圖”->“工具窗口”->“服務”,或使用快捷鍵Alt+F8(注意快捷鍵可能存在沖突)來打開Services窗口
    2024-10-10
  • Spring4下validation數(shù)據(jù)校驗無效(maven)的解決

    Spring4下validation數(shù)據(jù)校驗無效(maven)的解決

    這篇文章主要介紹了Spring4下validation數(shù)據(jù)校驗無效(maven)的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • SpringBoot?快速實現(xiàn)分庫分表的2種方式

    SpringBoot?快速實現(xiàn)分庫分表的2種方式

    本文將為您介紹?ShardingSphere?的一些基礎特性和架構(gòu)組成,以及在?Springboot?環(huán)境下通過JAVA編碼和Yml配置兩種方式快速實現(xiàn)分庫分表功能,感興趣的朋友跟隨小編一起看看吧
    2023-06-06
  • java8時間 yyyyMMddHHmmss格式轉(zhuǎn)為日期的代碼

    java8時間 yyyyMMddHHmmss格式轉(zhuǎn)為日期的代碼

    這篇文章主要介紹了java8時間 yyyyMMddHHmmss格式轉(zhuǎn)為日期的代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Java設計模式之觀察者模式

    Java設計模式之觀察者模式

    本文詳細講解了Java設計模式之觀察者模式,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09

最新評論

昌乐县| 承德县| 福贡县| 延寿县| 舒兰市| 文安县| 宝山区| 民勤县| 临汾市| 永济市| 太和县| 常州市| 灯塔市| 革吉县| 东光县| 彭山县| 临猗县| 阜新| 盐山县| 平谷区| 安仁县| 沙河市| 靖宇县| 霍山县| 成安县| 洮南市| 邵阳市| 城固县| 雷山县| 和林格尔县| 泸溪县| 行唐县| 平果县| 岫岩| 玛沁县| 东丽区| 松阳县| 津南区| 湖州市| 桐柏县| 宣汉县|