我正在創建一個包含 10 個執行緒的池每個執行緒運行 3 秒我將每個任務的啟動周期設定為 0.5 秒
問題是,如果池由 10 個執行緒組成,啟動周期為 0.5 秒,為什么從第一個執行緒開始需要 3 秒才能啟動第二個?畢竟,10 個執行緒應該在 0.5 秒內同時啟動,以此類推。
如果我使用 newSingleThreadScheduledExecutor 是可以理解的,但我使用的是帶有 10 個執行緒的 newScheduledThreadPool。
public class Main17 {
public static void main(String[] args) {
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10);
Runnable r = ()-> {
System.out.println("hello " System.currentTimeMillis());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
};
scheduledExecutorService.scheduleAtFixedRate(r,0, 500, TimeUnit.MILLISECONDS);
}
}
結果
hello 1646991199804
hello 1646991202816 // Interval greater than 0.5 seconds
hello 1646991205831
hello 1646991208840
hello 1646991211850
uj5u.com熱心網友回復:
執行緒在這里沒有效果。您必須了解您正在使用的方法的效果。
檔案scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit):
創建并執行一個周期性動作,該動作在給定的初始延遲后首先啟用,隨后在給定的周期內啟用;也就是說,執行將在 initialDelay 之后開始,然后是 initialDelay period,然后是 initialDelay 2 * period,依此類推。如果任務的任何執行遇到例外,則后續執行將被抑制。否則,任務只會通過取消或終止執行者來終止。
重要部分:
如果此任務的任何執行時間超過其周期,則后續執行可能會延遲開始,但不會同時執行。
executor 等待 500ms 的間隔或 runnable 的執行時間,以較長者為準。在您的情況下,是運行可運行檔案的時間,因此您的時間戳差異正好是 3 秒。
編輯:您可以查看這篇文章,其中有人遇到了同樣的問題。有兩個答案可以達到您想要的結果。
uj5u.com熱心網友回復:
參考官方檔案ScheduledExecutorService.scheduleAtFixedRate():
如果此任務的任何執行時間超過其周期,則后續執行可能會延遲開始,但不會同時執行。
來源:ScheduledExecutorService 檔案
uj5u.com熱心網友回復:
查看 scheduleAtFixedRate jdk 檔案
Blockquote 如果此任務的任何執行時間超過其周期,則后續執行可能會延遲開始,但不會同時執行。塊參考
您的任務至少需要 3 秒才能完成。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/442896.html
上一篇:C :丟棄執行緒與執行緒池
