AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁(yè) > 科技  > 軟件

Thread.onSpinWait()有什么作用?為什么要睡眠0毫秒?

來(lái)源: 責(zé)編: 時(shí)間:2024-04-12 17:33:32 177觀看
導(dǎo)讀概述今天在整理之前學(xué)習(xí)資料時(shí),偶然看見(jiàn)之前自己寫(xiě)的demo:public class MyTest { static volatile boolean temp = true; public static void main(String[] args) throws InterruptedException { Thread

pnw28資訊網(wǎng)——每日最新資訊28at.com

概述

今天在整理之前學(xué)習(xí)資料時(shí),偶然看見(jiàn)之前自己寫(xiě)的demo:pnw28資訊網(wǎng)——每日最新資訊28at.com

public class MyTest {    static volatile boolean temp = true;    public static void main(String[] args) throws InterruptedException {        Thread thread = new Thread(() -> {            while (temp) {                Thread.onSpinWait(); // Thread.sleep(0);            }            System.out.print("檢測(cè)到變量為false,退出循環(huán)");        });        thread.start();        Thread.sleep(3000L);        temp = false;    }}

運(yùn)行結(jié)果:pnw28資訊網(wǎng)——每日最新資訊28at.com

檢測(cè)到變量為false,退出循環(huán)

為了使線程能夠更快的循環(huán),以便讓我能夠及時(shí)的知道temp的狀態(tài),盡快的進(jìn)行下一次循環(huán),在方法中我比較粗暴的加入了Thread.onSpinWait()方法,Thread.onSpinWait()方法大家可以認(rèn)為是Thread.sleep(0)的作用,那么我為什么要加一個(gè)睡眠0毫秒的動(dòng)作呢?讓線程掛起0毫秒有什么用途呢?pnw28資訊網(wǎng)——每日最新資訊28at.com

線程狀態(tài)

在Java中,線程有三個(gè)基本的狀態(tài):就緒狀態(tài)(Runnable)、運(yùn)行狀態(tài)(Running)和阻塞狀態(tài)(Blocked)。pnw28資訊網(wǎng)——每日最新資訊28at.com

  • 就緒狀態(tài)(Runnable):當(dāng)線程被創(chuàng)建并啟動(dòng)后,它進(jìn)入就緒狀態(tài)。在就緒狀態(tài)下,線程已經(jīng)準(zhǔn)備好執(zhí)行,但還沒(méi)有獲取到CPU的執(zhí)行時(shí)間片。線程處于就緒狀態(tài)時(shí),可以被調(diào)度器選擇為下一個(gè)要執(zhí)行的線程。
  • 運(yùn)行狀態(tài)(Running):當(dāng)線程獲取到CPU的執(zhí)行時(shí)間片時(shí),它進(jìn)入運(yùn)行狀態(tài)。在運(yùn)行狀態(tài)下,線程正在執(zhí)行其任務(wù)代碼。線程會(huì)一直保持運(yùn)行狀態(tài),直到它主動(dòng)放棄CPU的執(zhí)行時(shí)間片,或者被其他高優(yōu)先級(jí)線程搶占CPU。
  • 阻塞狀態(tài)(Blocked):線程在某些情況下會(huì)進(jìn)入阻塞狀態(tài)。當(dāng)線程在執(zhí)行過(guò)程中遇到某些阻塞的情況,比如等待I/O操作、等待獲取鎖、等待其他線程的通知等,它會(huì)進(jìn)入阻塞狀態(tài)。在阻塞狀態(tài)下,線程暫時(shí)停止執(zhí)行,不會(huì)占用CPU資源。當(dāng)阻塞條件滿足時(shí),線程會(huì)被喚醒并重新進(jìn)入就緒狀態(tài),等待獲取CPU執(zhí)行時(shí)間片。

pnw28資訊網(wǎng)——每日最新資訊28at.com

線程的狀態(tài)轉(zhuǎn)換如下:pnw28資訊網(wǎng)——每日最新資訊28at.com

  • 就緒狀態(tài) -> 運(yùn)行狀態(tài):當(dāng)線程被調(diào)度器選擇為下一個(gè)要執(zhí)行的線程時(shí),它從就緒狀態(tài)轉(zhuǎn)換為運(yùn)行狀態(tài)。
  • 運(yùn)行狀態(tài) -> 就緒狀態(tài):線程主動(dòng)調(diào)用yield()方法或者sleep()方法,或者被其他高優(yōu)先級(jí)線程搶占CPU時(shí),它從運(yùn)行狀態(tài)轉(zhuǎn)換為就緒狀態(tài)。
  • 運(yùn)行狀態(tài) -> 阻塞狀態(tài):線程在執(zhí)行過(guò)程中遇到阻塞條件,比如等待I/O操作或獲取鎖時(shí),它從運(yùn)行狀態(tài)轉(zhuǎn)換為阻塞狀態(tài)。
  • 阻塞狀態(tài) -> 就緒狀態(tài):當(dāng)阻塞條件滿足時(shí),線程被喚醒,從阻塞狀態(tài)轉(zhuǎn)換為就緒狀態(tài),等待獲取CPU執(zhí)行時(shí)間片

線程的狀態(tài)轉(zhuǎn)換是由操作系統(tǒng)的調(diào)度器和Java虛擬機(jī)共同管理的。通過(guò)合理地管理線程的狀態(tài),可以實(shí)現(xiàn)多線程的并發(fā)執(zhí)行和協(xié)作操作。pnw28資訊網(wǎng)——每日最新資訊28at.com

Thread.sleep(0)的意義

Java中,使用Thread.sleep(0)的目的是讓當(dāng)前線程主動(dòng)放棄CPU的執(zhí)行時(shí)間片,以便給其他具有相同優(yōu)先級(jí)的線程執(zhí)行的機(jī)會(huì)。雖然參數(shù)為0,但實(shí)際上并不是讓線程休眠0毫秒,而是讓線程進(jìn)入就緒狀態(tài),等待重新獲取CPU執(zhí)行時(shí)間。pnw28資訊網(wǎng)——每日最新資訊28at.com

使用Thread.sleep(0)的主要意義在于提高多線程程序的公平性和響應(yīng)性。當(dāng)一個(gè)線程執(zhí)行Thread.sleep(0)時(shí),操作系統(tǒng)會(huì)重新調(diào)度其他就緒狀態(tài)的線程,這樣可以避免某個(gè)線程長(zhǎng)時(shí)間占用CPU而導(dǎo)致其他線程無(wú)法得到執(zhí)行的情況,從而提高了程序的公平性。pnw28資訊網(wǎng)——每日最新資訊28at.com

此外,Thread.sleep(0)還可以用于線程間的協(xié)作。當(dāng)一個(gè)線程需要通知其他線程進(jìn)行某些操作時(shí),可以使用Thread.sleep(0)來(lái)主動(dòng)放棄CPU執(zhí)行時(shí)間,讓其他線程有機(jī)會(huì)執(zhí)行相應(yīng)的操作。pnw28資訊網(wǎng)——每日最新資訊28at.com

Thread.onSpinWait()

@IntrinsicCandidatepublic static void onSpinWait() {}

onSpinWait()方法是空實(shí)現(xiàn),被@IntrinsicCandidate修飾,在JDK中,被@IntrinsicCandidate修飾的方法作為內(nèi)部候選方法(intrinsic candidate)。內(nèi)部候選方法是指可以由編譯器或虛擬機(jī)進(jìn)行特殊處理的方法,以提供更高效的執(zhí)行方式或更好的性能。pnw28資訊網(wǎng)——每日最新資訊28at.com

pnw28資訊網(wǎng)——每日最新資訊28at.com

簡(jiǎn)單來(lái)說(shuō)就是jdk對(duì)Thread.onSpinWait()方法進(jìn)行了特殊優(yōu)化,那么優(yōu)化后的效率到底有沒(méi)有提升呢?pnw28資訊網(wǎng)——每日最新資訊28at.com

public class MyTest {    public static void main(String[] args) throws InterruptedException {        long start = System.currentTimeMillis();        for (int i = 0; i < 100000000; i++) {            Thread.sleep(0);        }        System.out.println(System.currentTimeMillis() - start);        start = System.currentTimeMillis();        for (int i = 0; i < 100000000; i++) {            Thread.onSpinWait();        }        System.out.println(System.currentTimeMillis() - start);        start = System.currentTimeMillis();        for (int i = 0; i < 100000000; i++) {        }        System.out.println(System.currentTimeMillis() - start);    }}

運(yùn)行結(jié)果:pnw28資訊網(wǎng)——每日最新資訊28at.com

2322420

上述程序,循環(huán)一億次可以看出,在速度方面 空循環(huán) > Thread.onSpinWait() > Thread.sleep(0), 空循環(huán)和Thread.onSpinWait()僅存在細(xì)微差別。pnw28資訊網(wǎng)——每日最新資訊28at.com

在cpu利用方面: Thread.onSpinWait() = Thread.sleep(0) > 空循環(huán)pnw28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-83283-0.htmlThread.onSpinWait()有什么作用?為什么要睡眠0毫秒?

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: Facebook 為 React 寫(xiě)了一種語(yǔ)言,看完直呼 “秀” 啊!

下一篇: 告別重復(fù)勞動(dòng):2024年學(xué)會(huì)用Node.js一鍵搞定CLI工具

標(biāo)簽:
  • 熱門(mén)焦點(diǎn)
Top