自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

眨眼的功夫,就把定時(shí)任務(wù)的三種調(diào)度策略說(shuō)得明明白白

開(kāi)發(fā) 架構(gòu)
Spring Task 有三種模式,分別是:fixedDelay、cron 和 fixedRate。話(huà)不多說(shuō),這三種模式的用法都很簡(jiǎn)單,使用方式也很類(lèi)似。那么它們究竟有什么不同呢?下面我們通過(guò)一個(gè)五星級(jí)豪華公測(cè)的故事來(lái)說(shuō)明一下。

Spring Task 無(wú)疑是 Spring 環(huán)境下單機(jī)定時(shí)任務(wù)的首選。它用起來(lái)非常簡(jiǎn)單,功能也夠用。

Spring Task 有三種模式,分別是:fixedDelay、cron 和 fixedRate。話(huà)不多說(shuō),我們先看代碼:

@Slf4j
@Component
public class TimeTask {
private int[] people = {6, 2, 3, 1};
private int count = 0;
@Scheduled(fixedDelay = 5000)
public void fixedDelayTask() throws InterruptedException {
if (count < 4) {
int timeConsuming = people[count];
log.info("fixedDelayTask-----第 {} 個(gè)人在 {} 開(kāi)始如廁,耗時(shí):{} 秒", count + 1,
formatTime(),
timeConsuming);
Thread.sleep(timeConsuming * 1000L);
count++;
}
}
@Scheduled(cron = "0/5 * * * * ? ")
public void cronTask() throws InterruptedException {
if (count < 4) {
int timeConsuming = people[count];
log.info("cronTask-----第 {} 個(gè)人在 {} 開(kāi)始如廁,耗時(shí):{} 秒", count + 1,
formatTime(),
timeConsuming);
Thread.sleep(timeConsuming * 1000L);
count++;
}
}
@Scheduled(fixedRate = 5000)
public void fixedRateTask() throws InterruptedException {
if (count < 4) {
int timeConsuming = people[count];
log.info("fixedRateTask-----第 {} 個(gè)人在 {} 開(kāi)始如廁,耗時(shí):{} 秒", count + 1,
formatTime(),
timeConsuming);
Thread.sleep(timeConsuming * 1000L);
count++;
}
}
private String formatTime() {
return LocalTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss"));
}
}

這三種模式的用法都很簡(jiǎn)單,使用方式也很類(lèi)似。那么它們究竟有什么不同呢?下面我們通過(guò)一個(gè)五星級(jí)豪華公測(cè)的故事來(lái)說(shuō)明一下。

故事背景

話(huà)說(shuō)某地有一個(gè)五星級(jí)豪華廁所,大家都喜歡來(lái)這里如廁。因此坑位經(jīng)常供不應(yīng)求,需要排隊(duì)如廁。一天,廁所外有四個(gè)人排隊(duì),每個(gè)人如廁需要的時(shí)間如下:

  • 第一個(gè)人 6 秒鐘
  • 第二個(gè)人 2 秒鐘
  • 第三個(gè)人 3 秒鐘
  • 第四個(gè)人 1 秒鐘

從第一個(gè)人開(kāi)始如廁進(jìn)行計(jì)時(shí)。

fixedDelay 模式

日志輸出:

fixedDelayTask----- 1 個(gè)人在 18:07:23 開(kāi)始如廁,耗時(shí):6 
fixedDelayTask----- 2 個(gè)人在 18:07:34 開(kāi)始如廁,耗時(shí):2
fixedDelayTask----- 3 個(gè)人在 18:07:41 開(kāi)始如廁,耗時(shí):3
fixedDelayTask----- 4 個(gè)人在 18:07:49 開(kāi)始如廁,耗時(shí):1

@Scheduled(fixedDelay = 5000)。

廁所在該模式下有一個(gè)特點(diǎn):每次用完廁所后,需要有 5 秒鐘的廁所自潔時(shí)間,需要對(duì)廁所進(jìn)行清潔消毒等工作,從而保證下次使用的時(shí)候依然干凈衛(wèi)生。執(zhí)行情況如圖所示:

上個(gè)廁所的功夫,就把定時(shí)任務(wù)的三種調(diào)度策略說(shuō)得明明白白

  1. 第一個(gè)人在第 0 秒時(shí)開(kāi)始如廁,6 秒后結(jié)束,廁所需要 5 秒鐘的自潔時(shí)間。
  2. 第二個(gè)人在第 11 秒(6+5)時(shí)開(kāi)始如廁,2 秒后結(jié)束,廁所需要 5 秒鐘的自潔時(shí)間。
  3. 第三個(gè)人在第 18 秒(11+2+5)時(shí)開(kāi)始如廁,3 秒后結(jié)束,廁所需要 5 秒鐘的自潔時(shí)間。
  4. 第四個(gè)人在第 26 秒 (18+3+5)時(shí)開(kāi)始如廁,1 秒后結(jié)束…

Cron 模式

日志輸出:

cronTask----- 1 個(gè)人在 18:09:15 開(kāi)始如廁,耗時(shí):6 
cronTask----- 2 個(gè)人在 18:09:25 開(kāi)始如廁,耗時(shí):2
cronTask----- 3 個(gè)人在 18:09:30 開(kāi)始如廁,耗時(shí):3
cronTask----- 4 個(gè)人在 18:09:35 開(kāi)始如廁,耗時(shí):1

@Scheduled(cron = "0/5 * * * * ? ")。

在該模式下,廁所只在時(shí)間秒數(shù) 5 的整數(shù)倍時(shí)準(zhǔn)許人員進(jìn)入使用。因?yàn)橥ㄟ^(guò)嚴(yán)謹(jǐn)?shù)目茖W(xué)分析,發(fā)現(xiàn)在秒數(shù)為 5 的整數(shù)倍時(shí)如廁體驗(yàn)更佳,所以只有當(dāng)前時(shí)間秒數(shù)為 5 的整數(shù)倍時(shí)才可以進(jìn)入。并且,五星級(jí)豪華公廁升級(jí)設(shè)備,可以在如廁完成的瞬間完成自潔消毒,因此不再需要額外的自潔時(shí)間了,也提升了廁所利用率。執(zhí)行情況如圖所示:

上個(gè)廁所的功夫,就把定時(shí)任務(wù)的三種調(diào)度策略說(shuō)得明明白白

  1. 第一個(gè)人在 18:09:15 時(shí)開(kāi)始如廁,6 秒后(18:09:21)結(jié)束,下一個(gè)如廁吉時(shí)為 18:09:25。
  2. 第二個(gè)人在 18:09:25 時(shí)開(kāi)始如廁,2 秒后(18:09:27)結(jié)束,下一個(gè)如廁吉時(shí)為 18:09:30。
  3. 第三個(gè)人在 18:09:30 時(shí)開(kāi)始如廁,3 秒后(18:09:33)結(jié)束,下一個(gè)如廁吉時(shí)為 18:09:35。
  4. 第四個(gè)人在 18:09:35 時(shí)開(kāi)始如廁,1 秒后(18:09:36)結(jié)束…

fixedRate 模式

日志輸出:

fixedRateTask----- 1 個(gè)人在 18:10:18 開(kāi)始如廁,耗時(shí):6 
fixedRateTask----- 2 個(gè)人在 18:10:24 開(kāi)始如廁,耗時(shí):2
fixedRateTask----- 3 個(gè)人在 18:10:28 開(kāi)始如廁,耗時(shí):3
fixedRateTask----- 4 個(gè)人在 18:10:33 開(kāi)始如廁,耗時(shí):1

@Scheduled(fixedRate = 5000)。

經(jīng)過(guò)長(zhǎng)時(shí)間的大數(shù)據(jù)分析,得出一個(gè)結(jié)論——人的最佳如廁時(shí)長(zhǎng)是 5 秒鐘。所以在該模式下,人們?nèi)鐜?,廁所?huì)根據(jù)等待人數(shù)提前制定出如廁計(jì)劃,即為每位等待者分配 5 秒鐘如廁時(shí)間。但是有一個(gè)規(guī)則:當(dāng)如廁者提前結(jié)束,那么下一個(gè)人仍然需要等夠 5 秒鐘;而當(dāng)如廁者超時(shí)以后,待廁者可以在上一人完成時(shí)立即如廁。那么:

如廁計(jì)劃如下:

  1. 第一個(gè)人:第 0 秒進(jìn)入
  2. 第二個(gè)人:第 5 秒進(jìn)入
  3. 第三個(gè)人:第 10 秒進(jìn)入
  4. 第四個(gè)人:第 15 秒進(jìn)入

根據(jù)故事背景中每個(gè)人如廁時(shí)間,實(shí)際情況如圖所示:

上個(gè)廁所的功夫,就把定時(shí)任務(wù)的三種調(diào)度策略說(shuō)得明明白白

  1. 第一個(gè)人在第 0 秒時(shí),即 18:10:18 時(shí)開(kāi)始如廁,6 秒后結(jié)束,超時(shí),第二個(gè)人無(wú)縫如廁;
  2. 第二個(gè)人在第 6 秒(0+6)時(shí),即 18:10:24 開(kāi)始如廁,2 秒后結(jié)束,未超時(shí),第三個(gè)人等待 2 秒,按計(jì)劃時(shí)間如廁;
  3. 第三個(gè)人在第 10 秒(6+2+2)時(shí),即 18:10:28 開(kāi)始如廁,3 秒后結(jié)束,未超時(shí),第四個(gè)人等待 2 秒按計(jì)劃如廁;
  4. 第四個(gè)人在第 15 秒 (6+2+2+3+2)時(shí),即 18:10:33 開(kāi)始如廁,1 秒后結(jié)束…

Cron 表達(dá)式

Cron 模式是定時(shí)任務(wù)中最強(qiáng)大的觸發(fā)策略,可以應(yīng)對(duì)更多的情況。一個(gè) Cron 表達(dá)式總共有 7 個(gè)元素,分別如下表所示:

時(shí)間單位

是否必填

取值范圍

通配符

0-59 的整數(shù)

, - * / 四個(gè)字符

0-59 的整數(shù)

, - * / 四個(gè)字符

時(shí)

0-23 的整數(shù)

, - * / 四個(gè)字符

1-31 的整數(shù)(需要考慮該月的具體天數(shù))

,- * ? / L W C 八個(gè)字符

1~12 的整數(shù)或者 JAN-DEC

, - * / 四個(gè)字符

1~7 的整數(shù)或者 SUN-SAT (1=SUN)

, - * ? / L C # 八個(gè)字符

1970~2099

, - * / 四個(gè)字符

責(zé)任編輯:姜華 來(lái)源: 今日頭條
相關(guān)推薦

2021-02-23 08:10:18

Nginx反向代理負(fù)載均衡器

2010-09-06 17:35:03

PPPOE配置

2011-11-04 16:49:26

Action BarAndroid

2020-02-10 19:42:01

CPIP 協(xié)議,

2011-04-27 17:05:39

2010-10-08 15:05:00

無(wú)線路由設(shè)置

2012-02-20 21:59:08

無(wú)線路由設(shè)置

2021-09-30 09:59:23

OSPF網(wǎng)絡(luò)協(xié)議網(wǎng)絡(luò)技術(shù)

2021-09-26 07:38:39

組合問(wèn)題數(shù)據(jù)結(jié)構(gòu)算法

2010-07-05 15:33:49

2010-06-29 14:38:14

Linux服務(wù)器

2010-08-03 09:17:00

2010-09-09 09:52:03

Linux服務(wù)器

2010-07-14 09:55:12

2010-08-25 09:09:58

2010-10-15 10:01:19

無(wú)線網(wǎng)絡(luò)構(gòu)建

2025-01-08 09:55:37

Spring接口數(shù)據(jù)庫(kù)

2010-08-06 10:00:05

負(fù)載均衡

2020-11-18 09:25:39

Docker

2020-12-22 10:57:36

DockerLinux程序員
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)