簡體   English   中英

Java ScheduledExecutorService中使用的調度算法

[英]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

編輯

如果池中只有一個線程,則將調度任務p2p3,但在有可用線程之前不會執行它們。

看看下面的代碼示例:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM