Thread.onSpinWait() เป็น static method ใหม่ใน Java 9 เรียกใน busy-waiting loops (spin-wait) ให้ JVM ออกคำสั่ง processor เพิ่มประสิทธิภาพ ลด power consumption
ประโยชน์
- ปรับปรุง reaction time ใน spin-wait loops
- ลด power consumption ของ core thread
- ประโยชน์ต่อ power envelope รวมของโปรแกรม
- core threads อื่นทำงานเร็วขึ้นใน power budget เดียวกัน
ไวยากรณ์
public static void onSpinWait()
ตัวอย่างเปรียบเทียบ
public class SpinWaitDemo {
public static void main(String[] args) throws InterruptedException {
NormalTask task1 = new NormalTask();
SpinWaitTask task2 = new SpinWaitTask();
Thread t1 = new Thread(task1);
Thread t2 = new Thread(task2);
t1.start(); t2.start();
new Thread(() -> {
try { Thread.sleep(1000); }
catch (InterruptedException e) { e.printStackTrace(); }
finally { task1.start(); task2.start(); }
}).start();
t1.join(); t2.join();
}
abstract static class Task implements Runnable {
volatile boolean canStart = false;
void start() { canStart = true; }
}
static class NormalTask extends Task {
public void run() {
while (!canStart) { /* busy wait */ }
System.out.println("NormalTask Done!");
}
}
static class SpinWaitTask extends Task {
public void run() {
while (!canStart) { Thread.onSpinWait(); }
System.out.println("SpinWaitTask Done!");
}
}
}
ผลลัพธ์
NormalTask Done! SpinWaitTask Done!
SpinWaitTask ใช้ onSpinWait() จะมีประสิทธิภาพและประหยัดพลังงานกว่าในระหว่างรอ