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

Java中Thread類基本用法詳解

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

Thread類的作用

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

線程創(chuàng)建

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

繼承 Thread, 重寫 run

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

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

//通過(guò)繼承Runnable接口并實(shí)現(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) {
         //實(shí)例化Runnable對(duì)象
        MyRunnable runnable=new MyRunnable();
        //實(shí)例化線程對(duì)象并綁定任務(wù)
        Thread t=new Thread(runnable);
        t.start();
    }
}

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

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

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

//通過(guò)Runnable匿名內(nèi)部類創(chuàng)建一個(gè)線程
   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 表達(dá)式(最推薦)

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

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

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

線程中斷

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

1.使用標(biāo)志位來(lái)控制線程是否要停止

    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);
        //在主線程里就可以隨時(shí)通過(guò)flag變量的取值,來(lái)操作t線程是否結(jié)束
        flag=false;
    }
  • 自定義變量這種方式不能及時(shí)響應(yīng),尤其是在sleep休眠的時(shí)間比較久的時(shí)候。
  • 這個(gè)代碼之所以能夠起到修改flag, t線程就結(jié)束,完全取決于 t 線程內(nèi)部的代碼。
  • 代碼里通過(guò)flag控制循環(huán)。因此這里只是告訴讓這個(gè)線程結(jié)束,這個(gè)線程是否要結(jié)束,啥時(shí)候結(jié)束,都取決于 t 線程內(nèi)部代碼。

2.使用Thread自帶的標(biāo)志位來(lái)控制線程是否要停止

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)方法,通過(guò)這個(gè)方法可以獲取到當(dāng)前線程,哪個(gè)線程調(diào)用這個(gè)方法,就得到哪個(gè)線程的對(duì)象引用,類似于this。
isInterrupted():判斷線程是否終止,為true表示被終止,為false表示未被終止。
t.interrupt() :在上述代碼中,主線程調(diào)用t.interrupt(),相當(dāng)于主線程通知 t 線程要終止。

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

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

線程等待

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

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

總結(jié)

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

相關(guān)文章

  • Java的Spring框架中AOP項(xiàng)目的一般配置和部署教程

    Java的Spring框架中AOP項(xiàng)目的一般配置和部署教程

    這篇文章主要介紹了Java的Spring框架中AOP項(xiàng)目的一般配置和部署教程,AOP面向方面編程的項(xiàng)目部署結(jié)構(gòu)都比較類似,因而也被看作是Spring的一種設(shè)計(jì)模式使用,需要的朋友可以參考下
    2016-04-04
  • Java的Hello World詳解

    Java的Hello World詳解

    當(dāng)我們學(xué)習(xí)一門編程語(yǔ)言的時(shí)候,我們都會(huì)先學(xué)如何輸出Hello World!本文通過(guò)幾個(gè)例子給大家介紹輸出Hello World的代碼,感興趣的朋友一起看看吧
    2021-09-09
  • SpringBoot集成Prometheus實(shí)現(xiàn)監(jiān)控的過(guò)程

    SpringBoot集成Prometheus實(shí)現(xiàn)監(jiān)控的過(guò)程

    這篇文章主要介紹了SpringBoot集成Prometheus實(shí)現(xiàn)監(jiān)控,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • Springboot實(shí)現(xiàn)接口加密的示例代碼

    Springboot實(shí)現(xiàn)接口加密的示例代碼

    Springboot實(shí)現(xiàn)一個(gè)接口加密 首先來(lái)看效果 這個(gè)主要是為了防止篡改請(qǐng)求的。 我們這里采用的是一個(gè)AOP的攔截,在有需要這樣的接口上添加了加密處理。 下面是一些功能 防篡改 HMAC-SHA25
    2025-08-08
  • Java頻繁創(chuàng)建線程排查和解決方案

    Java頻繁創(chuàng)建線程排查和解決方案

    文章討論了Java線程池的使用和配置,以及線程對(duì)內(nèi)存的影響,作者通過(guò)實(shí)驗(yàn)和理論分析,指出線程并不是占用JVM的內(nèi)存,而是由操作系統(tǒng)分配的本地線程,文章還提到了線程池的優(yōu)點(diǎn),如節(jié)省系統(tǒng)開(kāi)銷、提高性能和方便控制
    2025-02-02
  • Mybatis逆向工程實(shí)現(xiàn)連接MySQL數(shù)據(jù)庫(kù)

    Mybatis逆向工程實(shí)現(xiàn)連接MySQL數(shù)據(jù)庫(kù)

    本文主要介紹了Mybatis逆向工程實(shí)現(xiàn)連接MySQL數(shù)據(jù)庫(kù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • java中超過(guò)int的最大范圍問(wèn)題

    java中超過(guò)int的最大范圍問(wèn)題

    文章討論了Java中處理超過(guò)int最大范圍的整數(shù)問(wèn)題,在接收到超過(guò)int范圍的參數(shù)時(shí),直接轉(zhuǎn)換會(huì)引發(fā)異常,建議使用Long或BigInteger處理,提供了代碼示例,包括JSP頁(yè)面和Servlet處理邏輯
    2026-05-05
  • Java之Algorithm_analysis案例詳解

    Java之Algorithm_analysis案例詳解

    這篇文章主要介紹了Java之Algorithm_analysis案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • 在Spring中利用@Order注解對(duì)bean和依賴進(jìn)行排序

    在Spring中利用@Order注解對(duì)bean和依賴進(jìn)行排序

    在Spring框架中,@Order是一個(gè)經(jīng)常被忽視但非常重要的注解,在項(xiàng)目開(kāi)發(fā)中,當(dāng)我們需要維護(hù)bean的特定順序或者存在許多相同類型的bean時(shí),這個(gè)注解就發(fā)揮了作用,這篇文章講的就是如何利用@Order注解對(duì)bean和依賴進(jìn)行排序,需要的朋友可以參考下
    2023-11-11
  • 使用Java實(shí)現(xiàn)PDF文字識(shí)別的方法詳解

    使用Java實(shí)現(xiàn)PDF文字識(shí)別的方法詳解

    在現(xiàn)代信息化的社會(huì)中,PDF文件已經(jīng)成為一種非常常見(jiàn)的文檔格式,本文將詳細(xì)介紹如何使用Java實(shí)現(xiàn)PDF文字識(shí)別,包括所需的工具、庫(kù)、代碼實(shí)現(xiàn)以及實(shí)際應(yīng)用中的注意事項(xiàng),需要的朋友可以參考下
    2025-02-02

最新評(píng)論

都兰县| 来安县| 鄢陵县| 来凤县| 光泽县| 老河口市| 阿克陶县| 宝山区| 庐江县| 涞源县| 临江市| 安多县| 焦作市| 泰兴市| 南投市| 霍林郭勒市| 吉木乃县| 仁化县| 文登市| 台州市| 盐边县| 剑阁县| 杭锦后旗| 武汉市| 辽中县| 南阳市| 慈利县| 谷城县| 山东省| 玉龙| 贡山| 白银市| 靖安县| 巫溪县| 昆明市| 南投市| 加查县| 淳安县| 青龙| 城市| 高邑县|