摘要:本人郵箱歡迎轉(zhuǎn)載轉(zhuǎn)載請注明網(wǎng)址代碼已經(jīng)全部托管有需要的同學(xué)自行下載引言同步工具都講的差不多了今天我們換一下口味講一下定時任務(wù)吧理論延時后執(zhí)行定時任務(wù)到達這個時間點執(zhí)行定時任務(wù)延時后執(zhí)行定時任務(wù)之后以為周期重復(fù)執(zhí)行到達這個時間點執(zhí)行定時任務(wù)之
引言本人郵箱:
歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明網(wǎng)址 http://blog.csdn.net/tianshi_kco
github: https://github.com/kco1989/kco
代碼已經(jīng)全部托管github有需要的同學(xué)自行下載
同步工具都講的差不多了,今天我們換一下口味.講一下定時任務(wù)Timer吧.
理論schedule(TimerTask task, long delay) 延時delayms后執(zhí)行定時任務(wù)task
schedule(TimerTask task, Date time) 到達這個time時間點執(zhí)行定時任務(wù)task
schedule(TimerTask task, long delay, long period) 延時delayms后執(zhí)行定時任務(wù)task,之后以periodms為周期重復(fù)執(zhí)行task
schedule(TimerTask task, Date firstTime, long period) 到達這個time時間點執(zhí)行定時任務(wù)task,之后以periodms為周期重復(fù)執(zhí)行task
scheduleAtFixedRate(TimerTask task, long delay, long period) 延時delayms后執(zhí)行定時任務(wù)task,之后以periodms為周期重復(fù)執(zhí)行task
scheduleAtFixedRate(TimerTask task, Date firstTime, long period) 到達這個time時間點執(zhí)行定時任務(wù)task,之后以periodms為周期重復(fù)執(zhí)行task
例子1 延時炸彈-倒計時炸彈細(xì)心的人會發(fā)現(xiàn)帶參數(shù)period的schedule和scheduleAtFixedRate的解釋是一樣,但是他們有什么區(qū)別
如果周期是30s,任務(wù)執(zhí)行時間是8s,那么兩者的執(zhí)行效果是一樣的
但是如果任務(wù)執(zhí)行時間大于周期時間呢?
scheduleAtFixedRate會按照周期時間來,即不管任務(wù)執(zhí)行多久,他都是周期一到就重新執(zhí)行task,
而schedule的下一次開始執(zhí)行時間是取決與上一次結(jié)束時間,如果任務(wù)執(zhí)行時間大于周期時間呢,那么它會按照執(zhí)行時間為周期執(zhí)行任務(wù)task
public class Demo1 { public static void main(String[] args) { Timer timer = new Timer(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); timer.schedule(new TimerTask() { @Override public void run() { System.out.println("炸彈爆炸時間:" + dateFormat.format(new Date())); } }, 4000); System.out.println("炸彈安裝時間:" + dateFormat.format(new Date())); } }
運行結(jié)果:
炸彈安裝時間:2016-10-31 20:00:25 炸彈爆炸時間:2016-10-31 20:00:29例子2 延時炸彈-時間點炸彈(到某個時間點就爆炸的炸彈)
public class Demo2 { public static void main(String[] args) throws ParseException { Timer timer = new Timer(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); timer.schedule(new TimerTask() { @Override public void run() { System.out.println("炸彈爆炸時間:" + dateFormat.format(new Date())); } }, dateFormat.parse("2016-10-31 20:04:00")); System.out.println("炸彈安裝時間:" + dateFormat.format(new Date())); } }
運行結(jié)果
炸彈安裝時間:2016-10-31 20:03:11 炸彈爆炸時間:2016-10-31 20:04:00例子3 延時連環(huán)炸彈
public class Demo3 { public static void main(String[] args) { Timer timer = new Timer(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); timer.schedule(new TimerTask() { @Override public void run() { System.out.println("炸彈爆炸時間:" + dateFormat.format(new Date())); } }, 2000,3000); System.out.println("炸彈安裝時間:" + dateFormat.format(new Date())); } }
運行結(jié)果
炸彈安裝時間:2016-10-31 20:05:46 炸彈爆炸時間:2016-10-31 20:05:48 炸彈爆炸時間:2016-10-31 20:05:51 炸彈爆炸時間:2016-10-31 20:05:54 炸彈爆炸時間:2016-10-31 20:05:57 炸彈爆炸時間:2016-10-31 20:06:00 炸彈爆炸時間:2016-10-31 20:06:03 炸彈爆炸時間:2016-10-31 20:06:06 ......例子4 時間點連環(huán)炸彈
public class Demo4 { public static void main(String[] args) throws ParseException { Timer timer = new Timer(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); timer.schedule(new TimerTask() { @Override public void run() { System.out.println("炸彈爆炸時間:" + dateFormat.format(new Date())); } }, dateFormat.parse("2016-10-31 20:08:30"), 2000); System.out.println("炸彈安裝時間:" + dateFormat.format(new Date())); } }
運行結(jié)果
炸彈安裝時間:2016-10-31 20:08:19 炸彈爆炸時間:2016-10-31 20:08:30 炸彈爆炸時間:2016-10-31 20:08:32 炸彈爆炸時間:2016-10-31 20:08:34 炸彈爆炸時間:2016-10-31 20:08:36 炸彈爆炸時間:2016-10-31 20:08:38 炸彈爆炸時間:2016-10-31 20:08:40 炸彈爆炸時間:2016-10-31 20:08:42 炸彈爆炸時間:2016-10-31 20:08:44 炸彈爆炸時間:2016-10-31 20:08:46 炸彈爆炸時間:2016-10-31 20:08:48 ......例子5 帶參數(shù)period的schedule和scheduleAtFixedRate的區(qū)別
public class Demo5 { public static void main(String[] args) throws ParseException { Timer timer = new Timer(); SimpleDateFormat dataFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); timer.schedule(new TimerTask() { @Override public void run() { try { Thread.sleep(4000); System.out.println("sub1執(zhí)行時間:" + dataFormat.format(this.scheduledExecutionTime()) + " --> 當(dāng)前時間:" + dataFormat.format(new Date())); } catch (InterruptedException e) { e.printStackTrace(); } } }, 0, 2000); } }
運行結(jié)果:
sub1執(zhí)行時間:2016-10-31 08:12:05 --> 當(dāng)前時間:2016-10-31 08:12:09 sub1執(zhí)行時間:2016-10-31 08:12:09 --> 當(dāng)前時間:2016-10-31 08:12:13 sub1執(zhí)行時間:2016-10-31 08:12:13 --> 當(dāng)前時間:2016-10-31 08:12:17 sub1執(zhí)行時間:2016-10-31 08:12:17 --> 當(dāng)前時間:2016-10-31 08:12:21 sub1執(zhí)行時間:2016-10-31 08:12:21 --> 當(dāng)前時間:2016-10-31 08:12:25 sub1執(zhí)行時間:2016-10-31 08:12:25 --> 當(dāng)前時間:2016-10-31 08:12:29 sub1執(zhí)行時間:2016-10-31 08:12:29 --> 當(dāng)前時間:2016-10-31 08:12:33 sub1執(zhí)行時間:2016-10-31 08:12:33 --> 當(dāng)前時間:2016-10-31 08:12:37 sub1執(zhí)行時間:2016-10-31 08:12:37 --> 當(dāng)前時間:2016-10-31 08:12:41 .....
現(xiàn)在將schedule改為scheduleAtFixedRate
public class Demo6 { public static void main(String[] args) throws ParseException { Timer timer = new Timer(); SimpleDateFormat dataFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { try { Thread.sleep(4000); System.out.println("sub1執(zhí)行時間:" + dataFormat.format(this.scheduledExecutionTime()) + " --> 當(dāng)前時間:" + dataFormat.format(new Date())); } catch (InterruptedException e) { e.printStackTrace(); } } }, 0, 2000); } }
運行結(jié)果:
sub1執(zhí)行時間:2016-10-31 08:13:51 --> 當(dāng)前時間:2016-10-31 08:13:55 sub1執(zhí)行時間:2016-10-31 08:13:53 --> 當(dāng)前時間:2016-10-31 08:13:59 sub1執(zhí)行時間:2016-10-31 08:13:55 --> 當(dāng)前時間:2016-10-31 08:14:03 sub1執(zhí)行時間:2016-10-31 08:13:57 --> 當(dāng)前時間:2016-10-31 08:14:07 sub1執(zhí)行時間:2016-10-31 08:13:59 --> 當(dāng)前時間:2016-10-31 08:14:11 sub1執(zhí)行時間:2016-10-31 08:14:01 --> 當(dāng)前時間:2016-10-31 08:14:15 sub1執(zhí)行時間:2016-10-31 08:14:03 --> 當(dāng)前時間:2016-10-31 08:14:19 .....
打賞兩個結(jié)果一對比,區(qū)別就很明顯了
如果覺得我的文章寫的還過得去的話,有錢就捧個錢場,沒錢給我捧個人場(幫我點贊或推薦一下)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/69946.html
摘要:顧名思義,是類型的線程安全原子類,可以在應(yīng)用程序中以原子的方式更新值。創(chuàng)建對象先來看下對象的創(chuàng)建。也就是說當(dāng)一個線程修改一個共享變量時,其它線程能立即讀到這個修改的值。 showImg(https://segmentfault.com/img/remote/1460000016012210); 本文首發(fā)于一世流云的專欄:https://segmentfault.com/blog... ...
摘要:是不能直接調(diào)用系統(tǒng)功能的,所以,我們沒有辦法直接實現(xiàn)多線程程序。通過查看,我們知道了有種方式實現(xiàn)多線程程序。使用的是搶占式調(diào)度模型演示如何設(shè)置和獲取線程優(yōu)先級返回線程對象的優(yōu)先級更改線程的優(yōu)先級線程默認(rèn)優(yōu)先級是。線程優(yōu)先級的范圍是。 第五階段 多線程 前言: 一個場景:周末,帶著并不存在的女票去看電影,無論是現(xiàn)場買票也好,又或是手機買票也好,上一秒還有位置,遲鈍了一下以后,就顯示該座位...
摘要:案例中的類就是線程獨有對象的代理者參與者參與者會處理多個委托的工作。然而,的實現(xiàn)思路讓每個對象,自身持有一個,這個的就是當(dāng)前對象,是本地線程變量值。 一、定義 Thread-Specific Storage就是線程獨有的存儲庫,該模式會對每個線程提供獨有的內(nèi)存空間。java.lang.ThreadLocal類提供了該模式的實現(xiàn),ThreadLocal的實例是一種集合(collecti...
摘要:另外一種方法是,將這個線程加入一個線程組,在線程組里重寫方法來處理拋出的異常,這時線程組的作用相當(dāng)于實現(xiàn)了的類。使用對象處理異常格式錯誤使用線程組處理異常測試異常 感性地理解一下什么是線程? 線程這個概念其實是比較抽象的,雖然依照教科書上的說法: 進程是從系統(tǒng)獲取資源的最小單位,線程是程序執(zhí)行的最小單位。程序是靜態(tài)存在于磁盤上的一段文本,進程運行這段文本記錄的命令。 也就是說,進程從系...
時間:2017年05月24日星期三說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)示例源碼:無個人學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程介紹 什么是定時任務(wù)調(diào)度 基于給定的時間點,給定的時間間隔或者給定的執(zhí)行次數(shù)自動執(zhí)行的任務(wù) 在Java中的定時調(diào)度工具 Timer:小弟,能實現(xiàn)日常60%的定...
閱讀 3240·2021-11-02 14:44
閱讀 3739·2021-09-02 15:41
閱讀 1682·2019-08-29 16:57
閱讀 1801·2019-08-26 13:38
閱讀 3310·2019-08-23 18:13
閱讀 2123·2019-08-23 15:41
閱讀 1685·2019-08-23 14:24
閱讀 3042·2019-08-23 14:03