亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java 線程執行受計數和時間限制

Java 線程執行受計數和時間限制

侃侃無極 2022-06-30 11:44:22
我有進程列表,我想像每分鐘十個進程一樣執行它們。我試過了ExecutorService,但沒有一個能支持我的情況,我也試過了,ThreadPoolExecutor但也許我無法弄清楚如何正確實現它。RateLimiterRxJava例子我有Runnable大小為100K的列表,每個Runnable都有這個邏輯:從 檢索數據rest api。對數據進行一些計算。將結果保存在數據庫中。所以我使用ExecutorService大小10并在內部設置延遲(5 秒)Runnable#run()來管理我需要的“每分鐘十個進程”,但仍然無法管理。這個邏輯的要點是減少對rest api.更新實際上,我們正在尋找的是有一個上限(在時間和操作數方面),而不是在各個操作之間平均分配時間,而不管它們各自的吞吐量如何。即,如果我有一個包含 100 個操作的列表,每個操作需要 0.5 秒,并且我有一個速率限制器,而不是(分發后)確定單個操作應該花費 0.8 秒,那么我可以使用 0.3 秒的間隙來啟動一個新的操作
查看完整描述

3 回答

?
翻翻過去那場雪

TA貢獻2065條經驗 獲得超14個贊

我認為使用 a 并以固定速率安排 a 將獲得最佳java.util.Timer結果。TimerTask


假設您有一個TimerTask在執行時打印出日期的。


public class PrintTimeAndIdTask extends TimerTask {


    private int id;


    public PrintTimeAndIdTask(int id) {

        this.id = id;

    }


    public void run() {

        System.out.println(new Date() + " : " + id);

    }

}

然后創建一個計時器并安排任務。每個都有不同的延遲,以便它們在您的首選時間間隔內平均分布。


public static void main(String[] args) {

    Timer timer = new Timer();


    int taskCount = 10;

    int timeIntervalMs = 60000;

    int delayBetweenTasks = timeIntervalMs / taskCount;



    for (int i = 0; i < taskCount; i++) {

        TimerTask timerTask = new PrintTimeAndIdTask(taskCount);


        int taskDelay = (long) taskCount * delayBetweenTasks;


        timer.scheduleAtFixedRate(timerTask, taskDelay, timeIntervalMs);

    }

}

您會看到每 6 秒執行一次任務。


Wed Feb 20 17:17:37 CET 2019 : 0

Wed Feb 20 17:17:43 CET 2019 : 1

Wed Feb 20 17:17:49 CET 2019 : 2

Wed Feb 20 17:17:55 CET 2019 : 3

Wed Feb 20 17:18:01 CET 2019 : 4

Wed Feb 20 17:18:07 CET 2019 : 5

Wed Feb 20 17:18:13 CET 2019 : 6

Wed Feb 20 17:18:19 CET 2019 : 7

Wed Feb 20 17:18:25 CET 2019 : 8

Wed Feb 20 17:18:31 CET 2019 : 9

Wed Feb 20 17:18:37 CET 2019 : 0

Wed Feb 20 17:18:43 CET 2019 : 1

Wed Feb 20 17:18:49 CET 2019 : 2

Wed Feb 20 17:18:55 CET 2019 : 3

....

請記住,Timer默認情況下 a 不作為守護線程運行。如果您沒有在應用程序關閉時明確取消它,它會繼續運行,因此您的應用程序將不會關閉。


查看完整回答
反對 回復 2022-06-30
?
猛跑小豬

TA貢獻1858條經驗 獲得超8個贊

我可能會從延遲隊列中提供我的線程池,將自己限制為每分鐘 10 個。

有關如何BlockingQueue.


查看完整回答
反對 回復 2022-06-30
?
慕工程0101907

TA貢獻1887條經驗 獲得超5個贊

你的意思是這樣嗎?產生一個線程的單個執行程序,該線程本身產生 10 個線程。


private static final int numProcesses = 10;

private static final ExecutorService executorService = Executors.newFixedThreadPool(numProcesses);


public static void main(String[] args)

{

    final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();

    executorService.scheduleAtFixedRate(Test::spawnTenThreads, 0, 5, TimeUnit.SECONDS);

}


private static void spawnTenThreads()

{

    for (int i = 0; i < numProcesses; ++i)

    {

        final int iteration = i;

        executorService.submit(() -> System.out.println(iteration));

    }

}


查看完整回答
反對 回復 2022-06-30
  • 3 回答
  • 0 關注
  • 270 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號