นากกายยืนหน้านาฬิกาทรายคิวงาน มีงานที่ครบเวลาโผล่ช่องอำพัน

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