本人郵箱: <kco1989@qq.com>
歡迎轉載,轉載請註明網址 http://blog.csdn.net/tianshi_kco
github: https://github.com/kco1989/kco
代碼已經所有託管github有須要的同窗自行下載java
同步工具都講的差很少了,今天咱們換一下口味.講一下定時任務Timer
吧.git
schedule(TimerTask task, long delay)
延時delay
ms後執行定時任務task
github
schedule(TimerTask task, Date time)
到達這個time
時間點執行定時任務task
微信
schedule(TimerTask task, long delay, long period)
延時delay
ms後執行定時任務task
,以後以period
ms爲週期重複執行task
ide
schedule(TimerTask task, Date firstTime, long period)
到達這個time
時間點執行定時任務task
,以後以period
ms爲週期重複執行task
工具
scheduleAtFixedRate(TimerTask task, long delay, long period)
延時delay
ms後執行定時任務task
,以後以period
ms爲週期重複執行task
this
scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
到達這個time
時間點執行定時任務task
,以後以period
ms爲週期重複執行task
spa
細心的人會發現帶參數
period
的schedule
和scheduleAtFixedRate
的解釋是同樣,可是他們有什麼區別
若是週期是30s,任務執行時間是8s,那麼二者的執行效果是同樣的
可是若是任務執行時間大於週期時間呢?scheduleAtFixedRate
會按照週期時間來,即無論任務執行多久,他都是週期一到就從新執行task
,
而schedule
的下一次開始執行時間是取決與上一次結束時間,若是任務執行時間大於週期時間呢,那麼它會按照執行時間爲週期執行任務task
.net
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())); } }
運行結果:code
炸彈安裝時間:2016-10-31 20:00:25 炸彈爆炸時間:2016-10-31 20:00:29
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())); } }
運行結果
炸彈安裝時間:2016-10-31 20:03:11 炸彈爆炸時間:2016-10-31 20:04:00
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())); } }
運行結果
炸彈安裝時間: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 ......
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())); } }
運行結果
炸彈安裝時間: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 ......
period
的schedule
和scheduleAtFixedRate
的區別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執行時間:" + dataFormat.format(this.scheduledExecutionTime()) + " --> 當前時間:" + dataFormat.format(new Date())); } catch (InterruptedException e) { e.printStackTrace(); } } }, 0, 2000); } }
運行結果:
sub1執行時間:2016-10-31 08:12:05 --> 當前時間:2016-10-31 08:12:09 sub1執行時間:2016-10-31 08:12:09 --> 當前時間:2016-10-31 08:12:13 sub1執行時間:2016-10-31 08:12:13 --> 當前時間:2016-10-31 08:12:17 sub1執行時間:2016-10-31 08:12:17 --> 當前時間:2016-10-31 08:12:21 sub1執行時間:2016-10-31 08:12:21 --> 當前時間:2016-10-31 08:12:25 sub1執行時間:2016-10-31 08:12:25 --> 當前時間:2016-10-31 08:12:29 sub1執行時間:2016-10-31 08:12:29 --> 當前時間:2016-10-31 08:12:33 sub1執行時間:2016-10-31 08:12:33 --> 當前時間:2016-10-31 08:12:37 sub1執行時間:2016-10-31 08:12:37 --> 當前時間:2016-10-31 08:12:41 .....
如今將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執行時間:" + dataFormat.format(this.scheduledExecutionTime()) + " --> 當前時間:" + dataFormat.format(new Date())); } catch (InterruptedException e) { e.printStackTrace(); } } }, 0, 2000); } }
運行結果:
sub1執行時間:2016-10-31 08:13:51 --> 當前時間:2016-10-31 08:13:55 sub1執行時間:2016-10-31 08:13:53 --> 當前時間:2016-10-31 08:13:59 sub1執行時間:2016-10-31 08:13:55 --> 當前時間:2016-10-31 08:14:03 sub1執行時間:2016-10-31 08:13:57 --> 當前時間:2016-10-31 08:14:07 sub1執行時間:2016-10-31 08:13:59 --> 當前時間:2016-10-31 08:14:11 sub1執行時間:2016-10-31 08:14:01 --> 當前時間:2016-10-31 08:14:15 sub1執行時間:2016-10-31 08:14:03 --> 當前時間:2016-10-31 08:14:19 .....
兩個結果一對比,區別就很明顯了
若是以爲個人文章寫的還過得去的話,有錢就捧個錢場,沒錢給我捧我的場(幫我點贊或推薦一下)