簡體   English   中英

Java ExecutorService,為隊列中的所有工作設置總體固定費率

[英]Java ExecutorService, setting an overall fixed rate for all work in a queue

給出以下代碼:

ScheduledExecutorService es = new ScheduledThreadPoolExecutor(100);

es.scheduleAtFixedRate(() -> {
        System.out.println("Do work with a fixed rate! ");
}, 0, 1000, TimeUnit.MILLISECONDS);


int i = 0;
while ( i < 100 ) {
        es.scheduleAtFixedRate(() -> {
                System.out.println("Do more work with a fixed rate! Doesn't really work! We will end up with 100 'workers', each running with a fixed rate! ");
        }, 0, 1000, TimeUnit.MILLISECONDS);

        i++;
}

這將創建一個SchedueledThreadPoolExecutor

在while循環中,我們正在模擬其他想要向隊列添加更多工作的人,但這顯然行不通。

我猜想,一個人需要實現某種ThreadPoolExecutor,它使用某種隊列,可能是延遲隊列。

這個想法是創建執行程序,然后以固定的速率執行任務。 如果任務完成得太快,則需要等待完成的線程才能完成更多工作。

如果一個進程完成得太慢,則全局時間應允許線程池中的其他線程完成更多工作。

http://docs.oracle.com/javase/7/docs/api/java/util/AbstractQueue.html

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/DelayQueue.html

但是我希望這已經完成,因為這應該是很常見的問題。

有人對此有很好的解決方案嗎?

目前尚不清楚您要做什么,但是我想您想要一種起搏器或節流閥,以確保以一定的速率執行任務(想想在辦公樓和其他建築物入口處發現的旋轉門,門的速度決定了每個時間單位可進入(或離開)建築物的人數以及每個入口(或出口)之間的時間差。

ScheduledExecutorServcice 不能解決該問題。 相反,首先要研究“ 漏桶”算法

ScheduledThreadPoolExecutor維護任務隊列,這些任務由任務的下一個計划執行順序排序。 這些任務(您提供的Runnable實例)完全獨立於將執行它們的線程。 換句話說,線程不僅獲取任務,執行任務,然后進入睡眠狀態等待任務的下一次執行。

而是,線程輪詢隊列,獲取任務,執行任務,通過將任務重新插入隊列來安排任務的下一次執行,然后再次輪詢隊列。 如果隊列中有任務,那就太好了。 如果沒有,他們將等到下一個任務准備就緒(無論它當前在隊列中還是以后添加)。 然后,他們重新啟動整個過程。

綜上所述,具有100個線程的ScheduledThreadPoolExecutor可以輕松地以任何類型的速率處理100多個任務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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