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

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

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

currentThread的詳解

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

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

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

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

為什么為main呢?

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

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

來(lái)看下面的一行代碼,我們創(chuàng)建一個(gè)新的線程,并且在線程創(chuàng)建的構(gòu)造方法和其實(shí)際執(zhí)行的run方法內(nèi),增加打印出當(dāng)前執(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();
    }

}

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

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

如何理解上述的情況呢?

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

TestThread testThread = new TestThread();

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

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

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

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

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

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

再看一種帶this的情況

public class TestThread extends Thread {

    public TestThread() {
        System.out.println("構(gòu)造方法開(kāi)始!");
        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方法開(kāi)始!");
        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)造方法開(kāi)始!
構(gòu)造方法:main
構(gòu)造方法的this名稱:Thread-0
構(gòu)造方法結(jié)束!
run方法開(kāi)始!
run方法:Thread-0
run方法的this名稱:Thread-0
run方法結(jié)束!

我們發(fā)現(xiàn)構(gòu)造的this名稱 為thread-0。這個(gè)不難理解,this指的是當(dāng)前對(duì)象的名稱。因?yàn)槲覀兊木€程在初始化的時(shí)候有了name,所以是thread-0。

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

public class TestThread extends Thread {

    public TestThread() {
        System.out.println("構(gòu)造方法開(kāi)始!");
        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方法開(kāi)始!");
        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)造方法開(kāi)始!
構(gòu)造方法:main
構(gòu)造方法的this名稱:Thread-0
構(gòu)造方法結(jié)束!
run方法開(kāi)始!
run方法:test
run方法的this名稱:test
run方法結(jié)束!

這里有人可能就要問(wèn)了,為啥構(gòu)造方法的this名稱為thread-0。實(shí)際run的時(shí)候就變?yōu)閠est了呢。
這是因?yàn)槲覀冊(cè)跇?gòu)造對(duì)象的時(shí)候,對(duì)象還不完整,沒(méi)有執(zhí)行到setName這一步。所以二者不一致。

最后看一段復(fù)雜的代碼

public class TestThread extends Thread {

    public TestThread() {
        System.out.println("構(gòu)造方法開(kāi)始!");
        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方法開(kāi)始!");
        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)造方法開(kāi)始!
構(gòu)造方法:main
構(gòu)造方法的this名稱:Thread-0
構(gòu)造方法結(jié)束!
新線程thread的名稱:Thread-1
run方法開(kāi)始!
run方法:test
run方法的this名稱:Thread-0
run方法結(jié)束!

我們根據(jù)結(jié)果來(lái)看,構(gòu)造方法的打印,和上面解釋的如出一轍。我們重點(diǎn)關(guān)注一下新線程的打印,這里為什么是1呢,因?yàn)槲覀兩厦娉跏蓟?之后已經(jīng)++所以為1。
run方法為test是因?yàn)槲覀儗?shí)際執(zhí)行的線程Thread thread = new Thread(testThread);所以我們獲取到的名稱是thread的名稱為test。
那么run方法的this名稱為什么是thread-0呢。因?yàn)閠his.getName獲取到的是當(dāng)前對(duì)象的名稱。我們的當(dāng)前對(duì)象是TestThread。他的線程名稱從未被改變過(guò),所以我們拿到了thread-0。

總結(jié)

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

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

相關(guān)文章

  • spring boot整合mybatis利用Mysql實(shí)現(xiàn)主鍵UUID的方法

    spring boot整合mybatis利用Mysql實(shí)現(xiàn)主鍵UUID的方法

    這篇文章主要給大家介紹了關(guān)于spring boot整合mybatis利用Mysql實(shí)現(xiàn)主鍵UUID的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • IDEA 中創(chuàng)建SpringBoot 父子模塊的實(shí)現(xiàn)

    IDEA 中創(chuàng)建SpringBoot 父子模塊的實(shí)現(xiàn)

    這篇文章主要介紹了IDEA 中創(chuàng)建SpringBoot 父子模塊的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 簡(jiǎn)單介紹java中equals以及==的用法

    簡(jiǎn)單介紹java中equals以及==的用法

    這篇文章主要介紹了簡(jiǎn)單介紹java中equals以及==的用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Spring?Boot?如何正確讀取配置文件屬性

    Spring?Boot?如何正確讀取配置文件屬性

    這篇文章主要介紹了Spring?Boot?如何正確讀取配置文件屬性,項(xiàng)目中經(jīng)常會(huì)經(jīng)常讀取配置文件中的屬性的值,Spring?Boot提供了很多注解讀取配置文件屬性,那么如何正確使用呢,下文一起來(lái)參考下面文章內(nèi)容吧
    2022-04-04
  • Spring框架核心概念小結(jié)

    Spring框架核心概念小結(jié)

    Spring是企業(yè)級(jí)Java的開(kāi)源開(kāi)發(fā)框架。Spring框架的核心功能可用于開(kāi)發(fā)任何java應(yīng)用程序,本文重點(diǎn)給大家介紹Spring框架核心概念總覽,感興趣的朋友跟隨小編一起看看吧
    2022-02-02
  • MyBatis-Plus聯(lián)表查詢以及分頁(yè)代碼實(shí)例

    MyBatis-Plus聯(lián)表查詢以及分頁(yè)代碼實(shí)例

    在開(kāi)發(fā)中遇到了一個(gè)問(wèn)題,需要進(jìn)行聯(lián)表查詢并進(jìn)行分頁(yè),因?yàn)椴幌胱约簛?lái)寫(xiě)分頁(yè),所以還是依靠MybatisPlus來(lái)實(shí)現(xiàn)想要的功能,下面這篇文章主要給大家介紹了關(guān)于MyBatis-Plus聯(lián)表查詢以及分頁(yè)的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • SpringBoot日志配置操作全面介紹

    SpringBoot日志配置操作全面介紹

    日志,通常不會(huì)在需求階段作為一個(gè)功能單獨(dú)提出來(lái),也不會(huì)在產(chǎn)品方案中看到它的細(xì)節(jié)。但是,這絲毫不影響它在任何一個(gè)系統(tǒng)中的重要的地位,這篇文章主要介紹了SpringBoot日志配置
    2022-10-10
  • SpringBoot返回html界面的使用示例

    SpringBoot返回html界面的使用示例

    本文主要介紹了SpringBoot返回html界面的使用示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11
  • 排查Java應(yīng)用內(nèi)存泄漏問(wèn)題的步驟

    排查Java應(yīng)用內(nèi)存泄漏問(wèn)題的步驟

    這篇文章主要介紹了排查Java應(yīng)用內(nèi)存泄漏問(wèn)題的步驟,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-11-11
  • SSH框架網(wǎng)上商城項(xiàng)目第10戰(zhàn)之搭建商品類基本模塊

    SSH框架網(wǎng)上商城項(xiàng)目第10戰(zhàn)之搭建商品類基本模塊

    這篇文章主要為大家詳細(xì)介紹了SSH框架網(wǎng)上商城項(xiàng)目第10戰(zhàn)之搭建商品類基本模塊的相關(guān)資料,有一定的實(shí)用性,感興趣的小伙伴們可以參考一下
    2016-06-06

最新評(píng)論