1. 程式人生 > 實用技巧 >ScheduledExecutorService 多執行緒,單執行緒的影響,定時任務,延時任務,週期任務

ScheduledExecutorService 多執行緒,單執行緒的影響,定時任務,延時任務,週期任務

adfa

1.schedule()方法

public static void main(String[] args) {
// 注意此處執行緒個數為1
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
long start = System.currentTimeMillis();
System.out.println("第一次提交");
executorService.schedule(()->{
System.out.println(System.currentTimeMillis() - start);
try {
// 注意此處休眠4秒
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}, 3, TimeUnit.SECONDS);
System.out.println("第二次提交");
executorService.schedule(()->{
System.out.println(System.currentTimeMillis() - start);
}, 3, TimeUnit.SECONDS);
}

總結:
該還輸有延時的作用,多次提交任務時,後面任務延時是否準確,與執行緒池的大小和上一個任務執行耗時時兩個因素有關;提交任務的先後順序與實際執行無關,與延遲時間有關


2.scheduleAtFixedRate()方法


public static void main(String[] args) {
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
executorService.scheduleAtFixedRate(()->{
System.out.println("coming");
try {
// 注意此處休眠時間為2s
Thread.sleep(2000);
System.out.println("sleep end");
} catch (InterruptedException e) {
e.printStackTrace();
}
// 延遲0s執行,週期為3s
}, 0, 3, TimeUnit.SECONDS);

結論:此方法是週期性方法,週期性執行任務,當任務消耗時長長於週期,那麼下一個任務將在上一個任務結束後馬上執行,當任務消耗時長短於週期,按照週期執行。


3.scheduleWithFixedDelay()方法
public static void main(String[] args) {
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
executorService.scheduleWithFixedDelay(()->{
System.out.println("coming");
try {
// 注意此處休眠時間為2s
Thread.sleep(2000);
System.out.println("sleep end");
} catch (InterruptedException e) {
e.printStackTrace();
}
// 第一個任務延遲0s執行,其餘延遲為3s
}, 0, 3, TimeUnit.SECONDS);
}

結論:此方法用於週期性執行,無論上一個方法耗時多長,下一個方法都會等到上一個方法執行完畢後,再delay到時間才執行。