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

Java四個(gè)線程常用函數(shù)超全使用詳解

 更新時(shí)間:2022年03月23日 09:05:12   作者:碼農(nóng)研究僧  
這篇文章主要為大家介紹了線程中常用的四個(gè)函數(shù):wait()、join()、sleep() 和 yield(),以及這四個(gè)函數(shù)的使用方法和相互之間的區(qū)別,需要的可以參考一下

前言

之前沒怎么關(guān)注到這兩個(gè)的區(qū)別以及源碼探討

后面被某個(gè)公司面試問到了,開始查漏補(bǔ)缺

1. wait()

使當(dāng)前線程等待,直到它被喚醒,通常是通過被通知或被中斷,或者直到經(jīng)過一定的實(shí)時(shí)時(shí)間。

本身屬于一個(gè)Object 類,查看源代碼也可知:public class Object {

查看其源碼可知,一共有三個(gè)重載的方法,詳情源代碼如下:

//第一個(gè)重載函數(shù)
public final void wait() throws InterruptedException {
        wait(0L);
    }
    
//第二個(gè)重載函數(shù)
public final native void wait(long timeoutMillis) throws InterruptedException;


//第三個(gè)重載函數(shù)
public final void wait(long timeoutMillis, int nanos) throws InterruptedException {
        if (timeoutMillis < 0) {
            throw new IllegalArgumentException("timeoutMillis value is negative");
        }

        if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
                                "nanosecond timeout value out of range");
        }

        if (nanos > 0 && timeoutMillis < Long.MAX_VALUE) {
            timeoutMillis++;
        }

        wait(timeoutMillis);
    }

具體實(shí)戰(zhàn)調(diào)用代碼如下:

如果執(zhí)行到了wait函數(shù),在這4秒內(nèi),會(huì)釋放鎖,并且暫停線程。如果這四秒內(nèi)配合notify()可以喚醒并且得到鎖,如果沒有喚醒,等待其他來競(jìng)爭(zhēng)。4秒結(jié)束后,會(huì)默認(rèn)自動(dòng)釋放鎖

當(dāng)前線程在 Thread.wait()等待過程中,如果Thread結(jié)束了,是可以自動(dòng)喚醒的而且自動(dòng)釋放鎖

@Override
public void run() {
       synchronized (a) {
           a.wait(4000);      
       }
}

2. join()

join是Thread類的方法

查看其源碼,具體源碼如下,三個(gè)重載的方法

//第一個(gè)重載函數(shù)
public final synchronized void join(final long millis)
    throws InterruptedException {
        if (millis > 0) {
            if (isAlive()) {
                final long startTime = System.nanoTime();
                long delay = millis;
                do {
                    wait(delay);
                } while (isAlive() && (delay = millis -
                        TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime)) > 0);
            }
        } else if (millis == 0) {
            while (isAlive()) {
                wait(0);
            }
        } else {
            throw new IllegalArgumentException("timeout value is negative");
        }
    }


//第二個(gè)重載函數(shù)
/*等待該線程死亡的時(shí)間最多為毫秒加納秒。 如果兩個(gè)參數(shù)都為0,則意味著永遠(yuǎn)等待。  
這個(gè)實(shí)現(xiàn)使用了This的循環(huán)。 等待電話以this.isAlive為條件。 當(dāng)一個(gè)線程終止this。 
調(diào)用notifyAll方法。 建議應(yīng)用程序不要使用wait、notify或notifyAll on Thread實(shí)例。  */
public final synchronized void join(long millis, int nanos)
throws InterruptedException {

    if (millis < 0) {
        throw new IllegalArgumentException("timeout value is negative");
    }

    if (nanos < 0 || nanos > 999999) {
        throw new IllegalArgumentException(
                            "nanosecond timeout value out of range");
    }

    if (nanos > 0 && millis < Long.MAX_VALUE) {
        millis++;
    }

    join(millis);
}


//第三個(gè)重載函數(shù)
/*等待線程死亡。  
此方法的調(diào)用與調(diào)用的行為完全相同  

InterruptedException—如果任何線程中斷了當(dāng)前線程。 當(dāng)拋出此異常時(shí),當(dāng)前線程的中斷狀態(tài)將被清除。  */
public final void join() throws InterruptedException {
     join(0);
 }

主要的時(shí)間參數(shù)邏輯如下:

  • 小于0,拋出異常
  • 等于0,join(A),判斷A是否存在,存在才執(zhí)行操作。該線程執(zhí)行wait(0)等待,等待A線程執(zhí)行完后才可結(jié)束
  • 大于0,同上,只不過執(zhí)行的是wait(long millis),等待時(shí)間結(jié)束后才可繼續(xù)執(zhí)行操作

3. sleep()

對(duì)比上一個(gè)wait函數(shù)

  • sleep(long mills):讓出CPU資源,但是不會(huì)釋放鎖資源。
  • wait():讓出CPU資源和鎖資源。

查看sleep函數(shù)的源碼,一共有兩個(gè)重載函數(shù)

都是Thread類的函數(shù)

/*根據(jù)系統(tǒng)計(jì)時(shí)器和調(diào)度器的精度和準(zhǔn)確性,
使當(dāng)前執(zhí)行的線程在指定的毫秒數(shù)內(nèi)處于睡眠狀態(tài)(暫時(shí)停止執(zhí)行)。 
線程不會(huì)失去任何監(jiān)視器的所有權(quán)。*/
public static native void sleep(long millis) throws InterruptedException;



/*導(dǎo)致當(dāng)前執(zhí)行的線程在指定的毫秒數(shù)加上指定的納秒數(shù)
(取決于系統(tǒng)計(jì)時(shí)器和調(diào)度器的精度和準(zhǔn)確性)內(nèi)休眠(暫時(shí)停止執(zhí)行)。 
線程不會(huì)失去任何監(jiān)視器的所有權(quán)。  */
public static void sleep(long millis, int nanos)
    throws InterruptedException {
        if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
                                "nanosecond timeout value out of range");
        }

        if (nanos > 0 && millis < Long.MAX_VALUE) {
            millis++;
        }

        sleep(millis);
    }

4. yield()

查看yield()函數(shù)的源碼,一個(gè)重載函數(shù)

都是Thread類的函數(shù)

向調(diào)度器暗示當(dāng)前線程愿意放棄當(dāng)前對(duì)處理器的使用。 調(diào)度器可以忽略這個(gè)提示。

Yield是一種啟發(fā)式嘗試,旨在改善線程之間的相對(duì)進(jìn)程,否則會(huì)過度使用CPU。 它的使用應(yīng)該與詳細(xì)的分析和基準(zhǔn)測(cè)試相結(jié)合,以確保它實(shí)際上具有預(yù)期的效果。

使用這種方法很少是合適的。 它可能用于調(diào)試或測(cè)試目的,在這些目的中,它可能有助于由于競(jìng)爭(zhēng)條件而重新生成錯(cuò)誤。 在設(shè)計(jì)并發(fā)控制構(gòu)造(如java.util.concurrent.locks包中的構(gòu)造)時(shí),它可能也很有用。

public static native void yield();

總的來說,yield函數(shù)的功能主要是:

讓出CPU調(diào)度,暫停線程,但不能由用戶指定時(shí)間

只能讓同優(yōu)先級(jí)有執(zhí)行機(jī)會(huì)

5. 總結(jié)

wait 暫停該線程,讓出cpu,釋放鎖。(Object類)

join暫停該線程,執(zhí)行該線程之后才能回到自身的線程運(yùn)行。(Thread類)

sleep 暫停該線程,讓出cpu,不釋放鎖。(Thread類)

yield 暫停該線程,但是不能由用戶制定,只能讓同優(yōu)先級(jí)有執(zhí)行機(jī)會(huì)。(Thread類)

5.1 wait和join的區(qū)別

看完以上的源碼以及邏輯代碼,再講講兩者的異同

總的來說

  • wait函數(shù):讓當(dāng)前線程進(jìn)入等待狀態(tài),wait()會(huì)與notify()和notifyAll()方法一起使用。notify為喚醒函數(shù)
  • join函數(shù):等待這個(gè)線程結(jié)束才能執(zhí)行自已的線程。它的主要起同步作用,使線程之間的執(zhí)行從“并行”變成“串行”。線程A中調(diào)用了線程B的join()方法時(shí),線程

執(zhí)行過程發(fā)生改變:線程A,必須等待線程B執(zhí)行完畢后,才可以繼續(xù)執(zhí)行下去

共同點(diǎn):

  • 暫停當(dāng)前的線程
  • 都可以通過中斷喚醒

不同點(diǎn)在于:

區(qū)別waitjoin
Object類Thread類
目的線程間通信排序,讓其串行通過
同步必須要synchronized可以不用synchronized

5.2 wait和sleep的區(qū)別

wait():讓出CPU資源和鎖資源。

sleep(long mills):讓出CPU資源,但是不會(huì)釋放鎖資源。

看區(qū)別,主要是看CPU的運(yùn)行機(jī)制:

它們的區(qū)別主要考慮兩點(diǎn):1.cpu是否繼續(xù)執(zhí)行、2.鎖是否釋放掉。

歸根到底:

wait,notify,notifyall 都是Object對(duì)象的方法,是一起使用的,用于鎖機(jī)制,所以會(huì)釋放鎖

而sleep是Thread類,跟鎖沒關(guān)系,不會(huì)釋放鎖

但是兩者都會(huì)讓出cpu資源

以上就是Java四個(gè)線程常用函數(shù)超全使用詳解的詳細(xì)內(nèi)容,更多關(guān)于Java線程函數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java 類與對(duì)象重難點(diǎn)詳解

    Java 類與對(duì)象重難點(diǎn)詳解

    類(class)和對(duì)象(object)是兩種以計(jì)算機(jī)為載體的計(jì)算機(jī)語言的合稱。對(duì)象是對(duì)客觀事物的抽象,類是對(duì)對(duì)象的抽象。類是一種抽象的數(shù)據(jù)類型
    2021-11-11
  • SpringMVC響應(yīng)視圖和結(jié)果視圖詳解

    SpringMVC響應(yīng)視圖和結(jié)果視圖詳解

    這篇文章主要介紹了SpringMVC響應(yīng)視圖和結(jié)果視圖,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java多線程中的CountDownLatch解析

    Java多線程中的CountDownLatch解析

    這篇文章主要介紹了Java多線程中的CountDownLatch解析,CountDownLatch是一個(gè)阻塞部分線程直到其他線程執(zhí)行完成后喚醒的同步計(jì)數(shù)器,核心是其內(nèi)部類Sync繼承于AQS,同時(shí)也是利用的AQS的同步原理,也稱之為閉鎖,需要的朋友可以參考下
    2023-11-11
  • spark中使用groupByKey進(jìn)行分組排序的示例代碼

    spark中使用groupByKey進(jìn)行分組排序的示例代碼

    這篇文章主要介紹了spark中使用groupByKey進(jìn)行分組排序的實(shí)例代碼,本文通過實(shí)例代碼給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • 詳解Java打包鏡像部署

    詳解Java打包鏡像部署

    這篇文章主要介紹了Java打包鏡像部署,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-11-11
  • Java后端學(xué)習(xí)精華之TCP通信傳輸協(xié)議詳解

    Java后端學(xué)習(xí)精華之TCP通信傳輸協(xié)議詳解

    TCP/IP是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,它會(huì)保證數(shù)據(jù)不丟包、不亂序。TCP全名是Transmission Control Protocol,它是位于網(wǎng)絡(luò)OSI模型中的第四層
    2021-09-09
  • spring-boot項(xiàng)目啟動(dòng)遲緩異常排查解決記錄

    spring-boot項(xiàng)目啟動(dòng)遲緩異常排查解決記錄

    這篇文章主要為大家介紹了spring-boot項(xiàng)目啟動(dòng)遲緩異常排查解決記錄,突然在本地啟動(dòng)不起來了,表象特征就是在本地IDEA上運(yùn)行時(shí),進(jìn)程卡住也不退出,應(yīng)用啟動(dòng)時(shí)加載相關(guān)組件的日志也不輸出
    2022-02-02
  • java實(shí)現(xiàn)網(wǎng)頁解析示例

    java實(shí)現(xiàn)網(wǎng)頁解析示例

    這篇文章主要介紹了java實(shí)現(xiàn)網(wǎng)頁解析示例,需要的朋友可以參考下
    2014-04-04
  • Java enum 對(duì)枚舉元素的賦值和取值方式

    Java enum 對(duì)枚舉元素的賦值和取值方式

    這篇文章主要介紹了Java enum 對(duì)枚舉元素的賦值和取值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java中解決跨域問題的方法匯總(建議收藏)

    Java中解決跨域問題的方法匯總(建議收藏)

    我們?cè)陂_發(fā)過程中經(jīng)常會(huì)遇到前后端分離而導(dǎo)致的跨域問題,導(dǎo)致無法獲取返回結(jié)果,下面給大家介紹Java中解決跨域問題的方法匯總,感興趣的朋友跟隨小編一起看看吧
    2024-04-04

最新評(píng)論

冷水江市| 林甸县| 鸡东县| 平阴县| 无棣县| 永和县| 阿坝县| 新巴尔虎右旗| 育儿| 潼南县| 时尚| 西乌珠穆沁旗| 朝阳县| 泸州市| 富宁县| 明水县| 昭觉县| 乌兰浩特市| 四平市| 北海市| 双江| 慈利县| 贵南县| 来安县| 庆元县| 成武县| 岱山县| 长治市| 瑞昌市| 高要市| 南华县| 垫江县| 呼玛县| 育儿| 壤塘县| 仙居县| 洛浦县| 佛教| 临高县| 峨眉山市| 阳谷县|