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

Java多線程Thread類(lèi)的使用詳解

 更新時(shí)間:2022年12月03日 14:14:40   作者:敲代碼の流川楓  
這篇文章主要介紹了Java多線程Thread類(lèi)的使用及注意事項(xiàng),在java標(biāo)準(zhǔn)庫(kù)中提供了一個(gè)Thread類(lèi)來(lái)表示/操作線程,Thread類(lèi)也可以視為是java標(biāo)準(zhǔn)庫(kù)提供的API

1.創(chuàng)建一個(gè)線程

Java操作線程最核心的類(lèi)就是Thread類(lèi)

創(chuàng)建線程有很多方法,下面我們寫(xiě)一個(gè)Mythread類(lèi)繼承 Thread 類(lèi)重寫(xiě)run()方法來(lái)創(chuàng)建線程

package thread;
class MyThread extends Thread{
    public void run(){
        System.out.println("hello world!");
    }
}
public class ThreaDemo1 {
    public static void main(String[] args) {
        Thread t = new MyThread();
    }
}

這里的Thread類(lèi)不需要import包,是因?yàn)檫@個(gè)類(lèi)和String,StringBuffer這些類(lèi)一樣是在java.lang包中,已經(jīng)自動(dòng)導(dǎo)入了!

run()方法是重寫(xiě)了Thread類(lèi)的run()方法,重寫(xiě)就是和父類(lèi)方法名參數(shù)都相同,子類(lèi)的方法通過(guò)動(dòng)態(tài)綁定機(jī)制被調(diào)用

就像上面的:

Thread t = new MyThread();
t.run();

這里的t是父類(lèi)的引用,調(diào)用的run()仍然是子類(lèi)的方法,本質(zhì)上t還是指向子類(lèi)對(duì)象

重載是同一個(gè)作用域,多個(gè)方法的方法名相同,參數(shù)個(gè)數(shù)或類(lèi)型不同的方法

2.start()方法與run()方法

我們用t調(diào)用一個(gè)strat方法

public class ThreaDemo1 {
    public static void main(String[] args) {
        Thread t = new MyThread();
        t.start();
    }
}

這里的hello world和我們直接在打印出來(lái)的hello world是不同的!!!

這里的是由t.start()創(chuàng)建了一個(gè)新的線程,然后由線程負(fù)責(zé)執(zhí)行t.run(),打印出hello world!

t.start()創(chuàng)建新的線程時(shí),調(diào)用了操作系統(tǒng)的API,通過(guò)操作系統(tǒng)內(nèi)核創(chuàng)建新線程的PCB,并把要執(zhí)行的指令交給這個(gè)PCB,當(dāng)PCB被調(diào)度到CPU上執(zhí)行的時(shí)候,就能執(zhí)行到run()方法中的代碼了

直接打印hello world時(shí),java進(jìn)程就只有一個(gè)線程(就是調(diào)用main方法的線程)也就是主線程

通過(guò)t.start(),主線程調(diào)用了t.start(),t.start()創(chuàng)建出新的線程,新的線程調(diào)用t.run();

當(dāng)run()方法執(zhí)行完畢,新的的線程就自動(dòng)銷(xiāo)毀

創(chuàng)建線程歸結(jié)到底還是要解決并發(fā)編程問(wèn)題,我們來(lái)看一個(gè)并發(fā)的例子

class MyThread extends Thread{
    public void run(){
        while(true){
            System.out.println("hello world!");
            //休眠
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}
public class ThreaDemo1 {
    public static void main(String[] args) {
        Thread t = new MyThread();
        t.start();
        while(true){
            System.out.println("hello main!");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

這段代碼并不是只執(zhí)行到一個(gè)循環(huán),死循環(huán)出不來(lái)了,而是交替執(zhí)行的

這就是并發(fā)執(zhí)行的效果,執(zhí)行的順序也是不確定的,主要原因是:操作系統(tǒng)調(diào)度線程的時(shí)候是"搶占式執(zhí)行",具體哪個(gè)線程先執(zhí)行,哪個(gè)線程后執(zhí)行,都是不確定的,取決于操作系統(tǒng)調(diào)度策略

雖然也是有優(yōu)先級(jí)的,但是從應(yīng)用程序方面來(lái)看到的效果是隨機(jī)的,我們?cè)诔绦蛏蠠o(wú)法修改的

如果我們只執(zhí)行t.run()會(huì)是什么情況呢?

public static void main(String[ ] args)l
Thread t = new MyThread(;
t.run();
while(true){
system.out.println("hello main! ");
try {
Thread.sleep( millis: 1000) ;
catch (InterruptedException e) {
throw new RuntimeException(e);
}

結(jié)果

這里只執(zhí)行了run方法,沒(méi)有執(zhí)行hellomain這里,是因?yàn)橹挥幸粋€(gè)主線程是單線程工作的

不會(huì)交替執(zhí)行,這就是單線程和多線程的差異

run()和start()的區(qū)別

run是線程里的方法,描述的是線程要執(zhí)行的任務(wù),但是線程還沒(méi)有執(zhí)行,只有調(diào)用start后,線程才會(huì)開(kāi)始運(yùn)行,調(diào)用后會(huì)申請(qǐng)線程并執(zhí)行run方法,執(zhí)行完后進(jìn)入銷(xiāo)毀線程階段,也就是說(shuō)strat才是真正創(chuàng)建了線程,并且線程是獨(dú)立的執(zhí)行流

3.查看線程

我們可以使用jdk自帶的工具jconsole查看當(dāng)前的java進(jìn)程中的所有線程

這個(gè)工具一般路徑:C:\Program Files\Java\jdk1.8.0_192\bin

雙擊打開(kāi)運(yùn)行會(huì)看到本地進(jìn)程

接下來(lái)點(diǎn)擊一下我們運(yùn)行的程序的線程

點(diǎn)擊線程

可以看到有很多線程

詳細(xì)信息

其它的線程都是JVM自帶的線程

注意:如果打開(kāi)工具本地進(jìn)程什么也沒(méi)有,可以嘗試用右鍵,管理員方式運(yùn)行

new Thread 對(duì)象時(shí),不創(chuàng)建線程,調(diào)用start才是創(chuàng)建PCB才有真實(shí)的線程

主線程調(diào)用就是start方法寫(xiě)到main方法中被調(diào)用

4.創(chuàng)建線程的各種方法

Java中創(chuàng)建線程的方法有很多種,上面使用的就是繼承Thread類(lèi),重寫(xiě)run()方法的方法,下面了解一下其他三種方法

4.1實(shí)現(xiàn)Runnable接口

回顧:

抽象類(lèi)和普通類(lèi)的區(qū)別:抽象類(lèi)不能實(shí)例化,不能直接new,必須有子類(lèi)繼承抽象類(lèi),然后抽象類(lèi)中有抽象方法,抽象方法沒(méi)有方法體,需要子類(lèi)重寫(xiě)抽象方法

接口比抽象類(lèi)更進(jìn)一步,抽象類(lèi)除抽象方法之外還有普通方法和屬性,接口則是只有抽象方法

class MyRunnable implements Runnable{
    public void run(){
        System.out.println("hello thread!");
    }
}
public class ThreadDemo2 {
    public static void main(String[] args) {
        Runnable runnable = new MyRunnable();
        Thread t = new Thread(runnable);
        t.start();
    }
}

Runnable是描述任務(wù),具體執(zhí)行細(xì)節(jié)就是run()方法,任務(wù)還要交給線程來(lái)執(zhí)行

使用Runnable接口達(dá)到了解耦合的目的,將線程和線程的任務(wù)分開(kāi),如果要修改代碼,代碼改動(dòng)就比較小

4.2使用匿名內(nèi)部類(lèi)

public class ThreadDemo3 {
    public static void main(String[] args) {
        Thread t = new Thread(){
            @Override
            public void run() {
                System.out.println("hello world!");
            }
        };
                t.start();
    }
}

這里創(chuàng)建了一個(gè)Thread的子類(lèi),子類(lèi)是匿名的,還創(chuàng)建了子類(lèi)的實(shí)例,并且讓t指向?qū)嵗?/p>

4.3使用匿名內(nèi)部類(lèi)實(shí)現(xiàn)Runnable

public class ThreadDemo4 {
    public static void main(String[] args) {
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("hello world!!");
            }
        });
        t.start();
    }
}

寫(xiě)法和1本質(zhì)相同,只不過(guò)把實(shí)現(xiàn)Runnable 任務(wù)交給匿名內(nèi)部類(lèi)的語(yǔ)法,此處是創(chuàng)建了一個(gè)類(lèi),實(shí)現(xiàn)Runnable,同時(shí)創(chuàng)建了實(shí)例,并且把實(shí)例傳給Thread的構(gòu)造方法(匿名內(nèi)部類(lèi)的創(chuàng)建的實(shí)例作為T(mén)hread的構(gòu)造方法參數(shù))

4.4使用Lambda表達(dá)式

這是比較簡(jiǎn)單的,推薦的寫(xiě)法

public class ThreadDemo5 {
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            System.out.println("hello world!!");
        });
        t.start();
    }
}

把任務(wù)通過(guò)Lambda表達(dá)式來(lái)描述,直接把Lambda表達(dá)式傳給Thread的構(gòu)造方法

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

相關(guān)文章

  • hibernate4基本配置方式詳解

    hibernate4基本配置方式詳解

    這篇文章給大家?guī)?lái)了hibernate4基本配置方式,非常不錯(cuò),具有參考借鑒價(jià)值,需要的額朋友參考下吧
    2017-09-09
  • idea配置Tomcat時(shí)沒(méi)有Artifacts選項(xiàng)的解決方法

    idea配置Tomcat時(shí)沒(méi)有Artifacts選項(xiàng)的解決方法

    本文主要介紹了idea配置Tomcat時(shí)沒(méi)有Artifacts選項(xiàng)的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 詳解如何使用Jersey客戶(hù)端請(qǐng)求Spring Boot(RESTFul)服務(wù)

    詳解如何使用Jersey客戶(hù)端請(qǐng)求Spring Boot(RESTFul)服務(wù)

    本篇文章主要介紹了詳解如何使用Jersey客戶(hù)端請(qǐng)求Spring Boot(RESTFul)服務(wù),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • 配置pom.xml用maven打包java工程的方法(推薦)

    配置pom.xml用maven打包java工程的方法(推薦)

    下面小編就為大家?guī)?lái)一篇配置pom.xml用maven打包java工程的方法(推薦)。小編覺(jué)得挺不錯(cuò)的, 現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • 基于idea把springboot項(xiàng)目部署到docker

    基于idea把springboot項(xiàng)目部署到docker

    這篇文章主要介紹了基于idea把springboot項(xiàng)目部署到docker,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • SpringBoot使用Maven插件進(jìn)行項(xiàng)目打包的方法

    SpringBoot使用Maven插件進(jìn)行項(xiàng)目打包的方法

    這篇文章主要介紹了SpringBoot使用Maven插件進(jìn)行項(xiàng)目打包的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Java刪除String中空格的多種解決方法匯總

    Java刪除String中空格的多種解決方法匯總

    在Java中從字符串中刪除空格有很多不同的方法,如trim,replaceAll等,下面這篇文章主要給大家介紹了關(guān)于Java刪除String中空格的多種解決方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • Java快速入門(mén)掌握類(lèi)與對(duì)象及變量的使用

    Java快速入門(mén)掌握類(lèi)與對(duì)象及變量的使用

    類(lèi)和對(duì)象是兩種以計(jì)算機(jī)為載體的計(jì)算機(jī)語(yǔ)言的合稱(chēng)。對(duì)象是對(duì)客觀事物的抽象,類(lèi)是對(duì)對(duì)象的抽象。類(lèi)是一種抽象的數(shù)據(jù)類(lèi)型;變量就是可以變化的量,存儲(chǔ)在內(nèi)存中—個(gè)可以擁有在某個(gè)范圍內(nèi)的可變存儲(chǔ)區(qū)域
    2022-04-04
  • java中實(shí)現(xiàn)自定義注解方式

    java中實(shí)現(xiàn)自定義注解方式

    注解是Java中的一種元數(shù)據(jù),可以修飾方法、類(lèi)、參數(shù)和包等,自定義注解需要public修飾符、@interface關(guān)鍵字,以及注解名稱(chēng)和類(lèi)型元素,元注解如@Target、@Retention等用于修飾注解,指定注解的適用范圍和生命周期,自定義注解的使用涉及到通過(guò)反射解析注解
    2024-11-11
  • 身份證號(hào)碼驗(yàn)證算法深入研究和Java實(shí)現(xiàn)

    身份證號(hào)碼驗(yàn)證算法深入研究和Java實(shí)現(xiàn)

    這篇文章主要介紹了身份證號(hào)碼驗(yàn)證算法深入研究和Java實(shí)現(xiàn),本文講解了18身份證號(hào)碼的結(jié)構(gòu)、根據(jù)17位數(shù)字本體碼獲取最后一位校驗(yàn)碼程序?qū)嵗葍?nèi)容,需要的朋友可以參考下
    2015-06-06

最新評(píng)論

前郭尔| 黑水县| 睢宁县| 广水市| 军事| 子洲县| 涞源县| 建宁县| 文山县| 泽库县| 瑞丽市| 自治县| 广安市| 探索| 麟游县| 佛教| 施甸县| 泾阳县| 罗山县| 绥棱县| 洛浦县| 安岳县| 荥阳市| 涿鹿县| 江北区| 东海县| 大城县| 屯门区| 东乡族自治县| 海丰县| 通州区| 中江县| 安福县| 吉林省| 古蔺县| 沁源县| 宁都县| 北流市| 股票| 乌海市| 友谊县|