JDK9新API:Thread.onSpinWait()
我們經常會線上程裡做一個while(boolean){}的操作,來進行條件等待,比如:
new Thread() {
@Override
public void run() {
while (isCall) {//女神怎麼還沒回我訊息啊
try {
sleep(1000);//隔一秒看下手機
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
但現在JDK9裡面給我們提供了一個新的API專門代替上面的//隔一秒看下手機,不過得注意這個得寫在你的迴圈體裡面(雖然寫在外面也不會錯啦,但是並沒有什麼用)
以下是例子:
public class HelloJDK9 {
volatile boolean eventNotificationNotReceived = true;
public void setEventNotificationNotReceived(boolean eventNotificationNotReceived) {
this.eventNotificationNotReceived = eventNotificationNotReceived;
}
public static void main(String[] args) {
HelloJDK9 helloJDK9 = new HelloJDK9();
new Thread() {
@Override
public void run() {
System.out.println("執行緒一開始等待執行緒二的指令");
while (helloJDK9.eventNotificationNotReceived) {
Thread.onSpinWait();
}
System.out.println("執行緒一收到執行緒二的指令");
}
};
new Thread() {
@Override
public void run() {
try {
System.out.println("執行緒二等待1秒");
sleep(1000);
helloJDK9.setEventNotificationNotReceived(false);
System.out.println("執行緒二發出指令");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
}
}
輸出結果為:
執行緒一開始等待執行緒二的指令
執行緒二等待1秒
執行緒二發出指令
執行緒一收到執行緒二的指令
雖說效果等同於上面的“sleep(1000);//隔一秒看下手機”,但是內部是不是真的是這樣呢?我們加幾句程式碼試驗下
while (helloJDK9.eventNotificationNotReceived) {
long time=System.currentTimeMillis();
Thread.onSpinWait();
System.out.println(System.currentTimeMillis()-time);
}
輸出結果為:
執行緒一開始等待執行緒二的指令
執行緒二等待1秒
0
....N個0
0
執行緒二發出指令
執行緒一收到執行緒二的指令
是0哎,真的是0ms嗎?那麼不測時間了,測下執行了多少次吧
int num=0;
while (helloJDK9.eventNotificationNotReceived) {
num++;
Thread.onSpinWait();
}
輸出結果為:
執行緒一開始等待執行緒二的指令
執行緒二等待1秒
執行緒二發出指令
執行緒一收到執行緒二的指令,num=102297173
好吧,還真可能是0ms。好吧,看下原始碼
@HotSpotIntrinsicCandidate
public static void onSpinWait() {}
。。。。。。。。。。。。。。。
原來如此—— ——~~!
相關文章
- JDK9新API:List.of();Map.of();Set.of();JDKAPI
- JDK9新特性詳解JDK
- JDK9新特性-你瞭解多少JDK
- web api的新玩法WebAPI
- 新的Google Ajax Search ApiGoAPI
- Java8新特性--Stream APIJavaAPI
- (譯)React ⚛️ 新的 Context APIReactContextAPI
- Java 8新特性(二):Stream APIJavaAPI
- Java 8新特性(四):新的時間和日期APIJavaAPI
- JDK 9新特性之Flow API 初探JDKAPI
- js陣列API--溫故知新JS陣列API
- iOS 7.1 API 有哪些新變化iOSAPI
- 基於JDK9的Spring核心爆RCE 0-day漏洞 - CyberJDKSpring
- Java 9中新的貨幣APIJavaAPI
- Java8新特性之時間APIJavaAPI
- 002.08 新聞搜尋 PySimpleGUI + News APIGUIAPI
- java8 – 新的時間日期API示例JavaAPI
- JDK1.8-新的日期和時間APIJDKAPI
- Java8新特性之日期-時間APIJavaAPI
- java8 新特性之日期時間 APIJavaAPI
- Java8新特性第3章(Stream API)JavaAPI
- 雲巴-JavaScript API測試與例項(新)JavaScriptAPI
- JDK6.0的新特性:使用Compiler APIJDKCompileAPI
- 掌握Postman,開啟API測試新紀元!PostmanAPI
- Spring 5.0 GA版本釋出,支援JDK9及反應式程式設計SpringJDK程式設計
- 熱門API介面它來啦 新鮮出爐API
- [iOS 10 day by day] Day 4:新的動畫 API UIViewPropertyAnimatoriOS動畫APIUIView
- 出售九九九成新的書了~---《Unity API解析》UnityAPI
- Java 8新特性之旅:使用Stream API處理集合JavaAPI
- 新編Win32API大全 (中文版).chmWin32API
- 07 一些API 和 Vue3 新元件APIVue元件
- 一文彙總全球熱門新聞APIAPI
- golang實現企業微信API,以第三方服務商角度整理的API,支援手動生成企業微信新API或新回撥程式碼GolangAPI
- 《Java 8 in Action》Chapter 12:新的日期和時間APIJavaAPTAPI
- Sample上新,從API 8開始支援!速來拿走API
- Swift 3必看:從使用場景瞭解GCD新APISwiftGCAPI
- JDK6.0的新特性之四:使用Compiler APIJDKCompileAPI
- 為什麼你應該放棄React老的Context API用新的Context APIReactContextAPI