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