DelayedWorkQueue踩坑筆記

小小少年_發表於2021-01-02

在看這個原始碼的時候,踩了一個大坑,因為看網上的部落格說:在這個類中,有一個DelayQueue的物件,但是我翻了幾遍原始碼(我看的是jdk8的原始碼),也沒看到這個內部類中有一個DelayQueue物件,直到我看了下這個類的繼承關係和DelayQueue的基本一樣之後,我覺得,有可能在jdk8中,這個內部類的原始碼改了,這個類自己去實現了DelayQueue的功能

所以我就去找了下jdk的原始碼,發現jdk7的ScheduleThreadPoolExecutor的內部類DelayedWorkQueue也沒有DelayQueue物件
我就再往前找,在jdk6的原始碼中,找到了

在這裡插入圖片描述
這裡可以看到,在jdk6原始碼中,確實是內建了一個DelayQueue物件,所有的方法都是呼叫的delayQueue的方法

但是在jdk7和jdk8中,DelayedWorkQueue實現了DelayQueue的功能,自己實現了入隊、出隊、重新入隊的功能

DelayQueue和DelayedWorkQueue的一個區別是:
前者入隊的必須是實現了Delayed介面的物件,後者不需要;也就是說DelayQueue中所儲存的物件必須是實現了Delayed介面的物件

public class DelayQueue<E extends Delayed> extends AbstractQueue<E>
    implements BlockingQueue<E> 

static class DelayedWorkQueue extends AbstractQueue<Runnable>
        implements BlockingQueue<Runnable>```

ScheduleThreadPoolExecutor和ThreadPoolExecutor的區別
1.scheduleThreadPoolExecutor對task進行了一層包裝,包裝成scheduleFutureTask
2.ScheduleThreadPoolExecutor不能設定最大執行緒數,只能使用指定的Integer.MAX_VALUE
3.ScheduleThreadPoolExecutor不能設定allowCoreThreadTimeOut屬性

相關文章