今天在整理之前學習資料時,偶然看見之前自己寫的demo:
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("檢測到變量為false,退出循環"); }); thread.start(); Thread.sleep(3000L); temp = false; }}
運行結果:
檢測到變量為false,退出循環
為了使線程能夠更快的循環,以便讓我能夠及時的知道temp的狀態,盡快的進行下一次循環,在方法中我比較粗暴的加入了Thread.onSpinWait()方法,Thread.onSpinWait()方法大家可以認為是Thread.sleep(0)的作用,那么我為什么要加一個睡眠0毫秒的動作呢?讓線程掛起0毫秒有什么用途呢?
在Java中,線程有三個基本的狀態:就緒狀態(Runnable)、運行狀態(Running)和阻塞狀態(Blocked)。
線程的狀態轉換如下:
線程的狀態轉換是由操作系統的調度器和Java虛擬機共同管理的。通過合理地管理線程的狀態,可以實現多線程的并發執行和協作操作。
Java中,使用Thread.sleep(0)的目的是讓當前線程主動放棄CPU的執行時間片,以便給其他具有相同優先級的線程執行的機會。雖然參數為0,但實際上并不是讓線程休眠0毫秒,而是讓線程進入就緒狀態,等待重新獲取CPU執行時間。
使用Thread.sleep(0)的主要意義在于提高多線程程序的公平性和響應性。當一個線程執行Thread.sleep(0)時,操作系統會重新調度其他就緒狀態的線程,這樣可以避免某個線程長時間占用CPU而導致其他線程無法得到執行的情況,從而提高了程序的公平性。
此外,Thread.sleep(0)還可以用于線程間的協作。當一個線程需要通知其他線程進行某些操作時,可以使用Thread.sleep(0)來主動放棄CPU執行時間,讓其他線程有機會執行相應的操作。
@IntrinsicCandidatepublic static void onSpinWait() {}
onSpinWait()方法是空實現,被@IntrinsicCandidate修飾,在JDK中,被@IntrinsicCandidate修飾的方法作為內部候選方法(intrinsic candidate)。內部候選方法是指可以由編譯器或虛擬機進行特殊處理的方法,以提供更高效的執行方式或更好的性能。
簡單來說就是jdk對Thread.onSpinWait()方法進行了特殊優化,那么優化后的效率到底有沒有提升呢?
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); }}
運行結果:
2322420
上述程序,循環一億次可以看出,在速度方面 空循環 > Thread.onSpinWait() > Thread.sleep(0), 空循環和Thread.onSpinWait()僅存在細微差別。
在cpu利用方面: Thread.onSpinWait() = Thread.sleep(0) > 空循環
本文鏈接:http://www.tebozhan.com/showinfo-26-83283-0.htmlThread.onSpinWait()有什么作用?為什么要睡眠0毫秒?
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com