1.守時(shí)使命完成方法比照
1.1.Timer
代碼例子如下
publicstaticvoidmain(String[]args){
DateTimeFormatterformatter=DateTimeFormatter.ofPattern(“yyyy-MM-ddHH:mm:ss”);
LocalDateTimelocalDateTime=LocalDateTime.now();
Stringformat=localDateTime.format(formatter);
System.out.println(“1:”+format);
Timertimer=newTimer();for(inti=0;i<2;i++){
timer.schedule(newTimerTask(){
@Overridepublicvoidrun(){try{
Thread.sleep(3000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
System.out.println(“Threadname:”+Thread.currentThread().getName());
LocalDateTimelocalDateTime=LocalDateTime.now();
Stringformat=localDateTime.format(formatter);
System.out.println(“2:”+format);
}
},3000);
}
localDateTime=LocalDateTime.now();
format=localDateTime.format(formatter);
System.out.println(“3:”+format);
}
成果
1:2019-10-1417:35:133:2019-10-1417:35:13Threadname:Timer-02:2019-10-1417:35:19Threadname:Timer-02:2019-10-1417:35:22
能夠看出同一個(gè)Timer的守時(shí)使命,后臺(tái)就一個(gè)線程辦理使命分配,遇到使命堵塞,可能導(dǎo)致下一個(gè)使命推遲
且如果使命發(fā)生反常,體系就終止了
1.2.ScheduledExecutorService
為了解決Timer的問題,ScheduledExecutorService做了改進(jìn),選用了線程池的守時(shí)使命行列,實(shí)際運(yùn)用的也是最小堆排序
代碼如下
privatestaticDateTimeFormatterformatter=DateTimeFormatter.ofPattern(“yyyy-MM-ddHH:mm:ss”);publicstaticvoidmain(String[]args){//timerTest();print(“1:”);
ScheduledExecutorServiceservice=newScheduledThreadPoolExecutor(2);for(inti=0;i<2;i++){
service.schedule(newRunnable(){
@Overridepublicvoidrun(){try{
Thread.sleep(3000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
System.out.println(“Threadname:”+Thread.currentThread().getName());
print(“2:”);
}
},3,TimeUnit.SECONDS);
}
print(“3:”);
service.shutdown();
}privatestaticvoidprint(Strings){
LocalDateTimelocalDateTime=LocalDateTime.now();
Stringformat=localDateTime.format(formatter);
System.out.println(s+format);
}
成果
1:2019-10-1511:53:543:2019-10-1511:53:54Threadname:pool-1-thread-12:2019-10-1511:54:00Threadname:pool-1-thread-22:2019-10-1511:54:00
明白它的推遲原理和Timer一樣,能夠知道如果我把核心線程數(shù)改成1,則效果和Timer類似
成果如下,兩個(gè)使命推遲3秒,前一個(gè)使命會(huì)導(dǎo)致后一個(gè)使命推遲
1:2019-10-1511:57:403:2019-10-1511:57:40Threadname:pool-1-thread-12:2019-10-1511:57:46Threadname:pool-1-thread-12:2019-10-1511:57:49
它的優(yōu)勢(shì)在于能夠多線程執(zhí)行,一定程度上防止使命間互相影響,一起單個(gè)使命反常不影響其它使命
1.3.時(shí)間輪(推遲音訊)
1
本質(zhì)是環(huán)形數(shù)組,比如上述8個(gè)節(jié)點(diǎn)的時(shí)間輪,每個(gè)節(jié)點(diǎn)寄存使命行列,比如我們需要新建5s推遲的使命,就放5的節(jié)點(diǎn),新建10s推遲的使命就放2的節(jié)點(diǎn),設(shè)推遲時(shí)間為n,則節(jié)點(diǎn)位置為n%8,一起需記下輪詢?nèi)?shù)n/8
優(yōu)勢(shì):當(dāng)使命數(shù)量十分多的時(shí)候選用這樣環(huán)形數(shù)組加行列是個(gè)效率比較高的挑選
想要了解更多時(shí)間輪完成,能夠參考文章下的參考博客
1.4.分布式守時(shí)使命
github上也有些開源的分布式守時(shí)使命的方案,能夠直接運(yùn)用
如xxl_job,elastic-job-lite,light-task-scheduler,以哪個(gè)火用哪個(gè)的準(zhǔn)則,那仍是xxl_job的星星最多,別的兩個(gè)已經(jīng)兩年沒更新了
廣州天河區(qū)珠江新城富力盈力大廈北塔2706
020-38013166(網(wǎng)站咨詢專線)
400-001-5281 (售后服務(wù)熱線)
深圳市坂田十二橡樹莊園F1-7棟
Site/ http://www.szciya.com
E-mail/ itciya@vip.163.com
品牌服務(wù)專線:400-001-5281
長(zhǎng)沙市天心區(qū)芙蓉中路三段398號(hào)新時(shí)空大廈5樓
聯(lián)系電話/ (+86 0731)88282200
品牌服務(wù)專線/ 400-966-8830
旗下運(yùn)營(yíng)網(wǎng)站:
Copyright ? 2016 廣州思洋文化傳播有限公司,保留所有權(quán)利。 粵ICP備09033321號(hào)