DelayQueue: ดึงงานเมื่อครบเวลาโดยไม่ busy-wait
น้องกายEngineering
อยากจัดคิวงานที่ “พร้อมหลัง N มิลลิวินาที” โดยไม่วน sleep เอง ใช้ DelayQueue ครับ
ตามAPI อิลิเมนต์ต้อง implement Delayed — take() บล็อกจนกว่างานจะหมดเวลา getDelay
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
public class Main {
static final class Job implements Delayed {
final long readyAt = System.nanoTime();
final String name;
Job(String name) { this.name = name; }
public long getDelay(TimeUnit unit) {
return unit.convert(readyAt - System.nanoTime(), TimeUnit.NANOSECONDS);
}
public int compareTo(Delayed o) {
return Long.compare(getDelay(TimeUnit.NANOSECONDS), o.getDelay(TimeUnit.NANOSECONDS));
}
}
public static void main(String[] args) throws Exception {
DelayQueue<Job> q = new DelayQueue<>();
q.put(new Job("now"));
Job got = q.poll(200, TimeUnit.MILLISECONDS);
assert got != null && got.name.equals("now");
System.out.println("DelayQueue tests passed");
}
}
เหมาะกับ retry backoff / session expiry ในโปรเซสเดียว — ถ้าต้องกระจายหลายเครื่องให้ใช้ระบบคิวภายนอก
Recap
- implement
Delayedให้ถูกต้องเรื่องgetDelay/compareTo - ใช้
take/pollแทน busy loop - อ่านเอกสาร DelayQueue
- อย่าใช้แทน distributed scheduler