場景描述:
在服務(wù)器上出現(xiàn)了一些不太合理數(shù)據(jù),數(shù)據(jù)處理采用的是定時任務(wù)(@Scheduled中fixedDelay屬性),一開始對fixedDelay的理解就是:上次任務(wù)執(zhí)行完畢后,然后間隔配置的時間才會執(zhí)行下一次任務(wù)。
fixedDelay多線程處理:
場景一:假設(shè)足夠的線程在相隔的時間內(nèi)能夠處理完任務(wù)
場景一結(jié)果:在線程池線程數(shù)在相隔時間內(nèi)足夠執(zhí)行任務(wù),下一次任務(wù)的啟動時間就是配置的間隔時間。
場景二:在多線程環(huán)境下,如果需要處理的數(shù)據(jù)比較多,一開始的理解,就算需要處理的數(shù)據(jù)再多,那么下一次任務(wù)的執(zhí)行也是在當前任務(wù)執(zhí)行完畢后才會開始啟動,然而并非如此,代碼塊如下所示:
場景二結(jié)果:在每一個任務(wù)中,線程睡眠五秒鐘,得出的結(jié)果是下一個任務(wù)的啟動還是fixedDelay配置的時間,如果上一次任務(wù)沒有執(zhí)行完畢,下次任務(wù)如果啟動也不會執(zhí)行對應(yīng)的任務(wù),而是需要等待上一次任務(wù)真正執(zhí)行完畢才會執(zhí)行。
fixedRate多線程處理:
場景一:如果兩個任務(wù)相隔的時間足夠長,線程能充分的處理完這些數(shù)據(jù):
場景一結(jié)果:還是相隔配置的時間執(zhí)行下一次任務(wù)
場景二:假設(shè)在相隔的時間內(nèi)不能處理完任務(wù);到了相隔的時間下一個任務(wù)還是會啟動,但會被阻塞到上一個任務(wù)執(zhí)行完畢才會執(zhí)行當前這個任務(wù)。
fixedRate單線程處理:
fixedRate代碼塊如下所示:
fixedRate結(jié)果:如果任務(wù)的處理時間大于fixedRate配置的時間,那么當任務(wù)結(jié)束的時候則會立馬執(zhí)行。如果是在相隔的時間段內(nèi)處理完畢,假設(shè)設(shè)置的是5s,任務(wù)花了3s執(zhí)行完畢,那么在2s后則會執(zhí)行下一個任務(wù)。
fixedDelay單線程處理:
fixedDelay代碼塊如下所示:
fixedDelay結(jié)果:如果設(shè)定的是相隔5s執(zhí)行,當前任務(wù)假設(shè)需要花費8s,那么下一次的執(zhí)行的時間為當前任務(wù)執(zhí)行完畢后,相隔5s后再執(zhí)行。
如何驗證多線程任務(wù)執(zhí)行完畢?
1、可以采用isTerminated()方法檢測多線程是否執(zhí)行完畢。
2、可以采用CountDownLatch的await()方法實現(xiàn)。