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

Java多線程Thread類的使用詳解

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

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

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

創(chuàng)建線程有很多方法,下面我們寫一個Mythread類繼承 Thread 類重寫run()方法來創(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類不需要import包,是因?yàn)檫@個類和String,StringBuffer這些類一樣是在java.lang包中,已經(jīng)自動導(dǎo)入了!

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

就像上面的:

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

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

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

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

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

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

這里的hello world和我們直接在打印出來的hello world是不同的!!!

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

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

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

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

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

創(chuàng)建線程歸結(jié)到底還是要解決并發(fā)編程問題,我們來看一個并發(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í)行到一個循環(huán),死循環(huán)出不來了,而是交替執(zhí)行的

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

雖然也是有優(yōu)先級的,但是從應(yīng)用程序方面來看到的效果是隨機(jī)的,我們在程序上無法修改的

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

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方法,沒有執(zhí)行hellomain這里,是因?yàn)橹挥幸粋€主線程是單線程工作的

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

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

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

3.查看線程

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

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

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

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

點(diǎn)擊線程

可以看到有很多線程

詳細(xì)信息

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

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

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

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

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

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

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

回顧:

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

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

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ù)還要交給線程來執(zhí)行

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

4.2使用匿名內(nè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)建了一個Thread的子類,子類是匿名的,還創(chuàng)建了子類的實(shí)例,并且讓t指向?qū)嵗?/p>

4.3使用匿名內(nè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();
    }
}

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

4.4使用Lambda表達(dá)式

這是比較簡單的,推薦的寫法

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

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

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

相關(guān)文章

  • Java線程在什么情況下可以終止

    Java線程在什么情況下可以終止

    Thread線程類自帶的stop方法,但是jdk不建議使用,因?yàn)閟top方法終止線程只是強(qiáng)行終止,內(nèi)存中部分值可能已發(fā)生變化,并未保證數(shù)據(jù)的一致性,將會導(dǎo)致線程安全問題,那么在什么情況下可以終止線程呢,本篇帶你探究一下
    2022-04-04
  • Java?JDK的多版本共存實(shí)現(xiàn)方法

    Java?JDK的多版本共存實(shí)現(xiàn)方法

    有時候系統(tǒng)中需要多個jdk版本共存,我們在做特定的操作時需要特定的版本,這篇文章主要給大家介紹了關(guān)于Java?JDK的多版本共存實(shí)現(xiàn)?的相關(guān)資料,需要的朋友可以參考下
    2023-09-09
  • Spring?Boot?RestController接口輸出到終端的操作代碼

    Spring?Boot?RestController接口輸出到終端的操作代碼

    這篇文章主要介紹了Spring?Boot?RestController接口如何輸出到終端,使用?HttpServletResponse?類,可以在使用curl執(zhí)行?Spring?Boot?REST接口的同時,在控制臺輸出一些信息,給運(yùn)維人員知道當(dāng)前命令執(zhí)行的狀態(tài),感興趣的朋友跟隨小編一起看看吧
    2023-09-09
  • 淺談java中BigDecimal的equals與compareTo的區(qū)別

    淺談java中BigDecimal的equals與compareTo的區(qū)別

    下面小編就為大家?guī)硪黄獪\談java中BigDecimal的equals與compareTo的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • Springboot整合Urule的方法步驟

    Springboot整合Urule的方法步驟

    這篇文章主要介紹了Springboot整合Urule的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • SpringSecurity如何配置跨域訪問

    SpringSecurity如何配置跨域訪問

    這篇文章主要介紹了SpringSecurity如何配置跨域訪問方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • JDK-StringJoiner構(gòu)造及添加元素源碼分析

    JDK-StringJoiner構(gòu)造及添加元素源碼分析

    這篇文章主要為大家介紹了JDK-StringJoiner構(gòu)造及添加元素源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • java發(fā)送form-data請求實(shí)現(xiàn)文件上傳的示例代碼

    java發(fā)送form-data請求實(shí)現(xiàn)文件上傳的示例代碼

    最近做一個需求,需要請求第三方接口上傳文件,該請求類型是form-data請求,本文就來介紹一下java發(fā)送form-data請求實(shí)現(xiàn)文件上傳的示例代碼,感興趣的可以了解一下
    2023-12-12
  • Java設(shè)計模式中的工廠及抽象工廠模式解析

    Java設(shè)計模式中的工廠及抽象工廠模式解析

    這篇文章主要介紹了Java設(shè)計模式中的工廠及抽象工廠模式解析,工廠模式作為創(chuàng)建型設(shè)計模式中常見的設(shè)計方法,一般情況下,工廠模式分為3種,簡單工作、工廠方法、抽象工作,其實(shí)簡單工廠只是工廠方法的一種特例,需要的朋友可以參考下
    2023-12-12
  • java實(shí)現(xiàn)后臺數(shù)據(jù)顯示在前端

    java實(shí)現(xiàn)后臺數(shù)據(jù)顯示在前端

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)后臺數(shù)據(jù)顯示在前端,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02

最新評論