[英]Scheduling algorithm used in Java ScheduledExecutorService
我使用ScheduledExecutorService
來安排多個java作業。 我想知道在以下場景中發生了什么:
如果我正在使用,
ScheduledFuture scheduleAtFixedRate(Runnable命令,long initialDelay,long period,TimeUnit unit)
用於調度線程池大小為1的5個作業
p1 - 5(執行間隔,以分鍾為單位)
p2 - 5
p3 - 5
p4 - 7
第5-10頁
5分鍾后,p1,p2和p3將激活爭用。
將作業分配給一個可用線程的算法是什么? 他們會以循環方式分配嗎?
現在在第7分鍾,說p1和p2完成並且p4變為活動狀態,但是p3是內存密集型的並且最終使用整個內存,然后我認為由於內存不足,調度程序本身不會被調度。 有沒有辦法確保為調度程序保留一些內存?
ScheduledExecutorService
是一個接口,它不會定義您要詢問的任何內容。
所以答案取決於您使用的具體實現。 如果您使用Executors.newScheduledThreadPool
那么您實際上正在使用ScheduledThreadPoolExecutor
。 javadoc說:
按照先進先出(FIFO)提交順序啟用計划完全相同執行時間的任務。
我不確定我理解你關於記憶的第二個問題 - 要么你有足夠的記憶,要么你沒有。 如果你不這樣做,你會得到一個OutOfMemoryError。
5分鍾后任務之間不會發生爭用。
任務被傳遞到隊列中,如果沒有可用的線程來執行它們,它們將按FIFO順序執行,至少給定ScheduledThreadPoolExecutor
實現。
請注意,如果您有未處理的異常,您的待處理任務可能會“靜默”取消。
ScheduledFuture scheduleAtFixedRate(Runnable命令,long initialDelay,long period,TimeUnit unit)
創建並執行一個周期性操作,該操作在給定的初始延遲后首先啟用,隨后在給定的時間段內啟用; 即執行將在initialDelay之后開始,然后是initialDelay + period,然后是initialDelay + 2 * period,依此類推。
如果任務的任何執行遇到異常 ,則后續執行被禁止。 否則,任務將僅通過取消或終止執行者來終止。 如果此任務的執行時間超過其周期,則后續執行可能會延遲 ,但不會同時執行。
內存已經為調度程序實例“保留”,如果任務耗盡所有剩余的內存,JVM將不會從調度程序中獲取它們。 這可能會導致OutOfMemoryError 。
編輯
如果池中只有一個線程,則將調度任務p2和p3,但在有可用線程之前不會執行它們。
看看下面的代碼示例:
private static final ScheduledExecutorService scheduledService = Executors.newSingleThreadScheduledExecutor();
public static void main(String[] args) {
scheduledService.submit(() -> {
System.out.println("p1");
try
{
TimeUnit.SECONDS.sleep(15);
} catch (Exception e) {}
});
scheduledService.scheduleAtFixedRate(()-> System.out.println("p2"), 1, 5, TimeUnit.SECONDS);
}
}
一旦p1完成, p2將立即輸出三次,這表明任務已安排但無法在請求的時間執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.