摘要:本人郵箱歡迎轉載轉載請注明網址代碼已經全部托管有需要的同學自行下載引言同步工具都講的差不多了今天我們換一下口味講一下定時任務吧理論延時后執行定時任務到達這個時間點執行定時任務延時后執行定時任務之后以為周期重復執行到達這個時間點執行定時任務之
引言本人郵箱:
歡迎轉載,轉載請注明網址 http://blog.csdn.net/tianshi_kco
github: https://github.com/kco1989/kco
代碼已經全部托管github有需要的同學自行下載
同步工具都講的差不多了,今天我們換一下口味.講一下定時任務Timer吧.
理論schedule(TimerTask task, long delay) 延時delayms后執行定時任務task
schedule(TimerTask task, Date time) 到達這個time時間點執行定時任務task
schedule(TimerTask task, long delay, long period) 延時delayms后執行定時任務task,之后以periodms為周期重復執行task
schedule(TimerTask task, Date firstTime, long period) 到達這個time時間點執行定時任務task,之后以periodms為周期重復執行task
scheduleAtFixedRate(TimerTask task, long delay, long period) 延時delayms后執行定時任務task,之后以periodms為周期重復執行task
scheduleAtFixedRate(TimerTask task, Date firstTime, long period) 到達這個time時間點執行定時任務task,之后以periodms為周期重復執行task
例子1 延時炸彈-倒計時炸彈細心的人會發現帶參數period的schedule和scheduleAtFixedRate的解釋是一樣,但是他們有什么區別
如果周期是30s,任務執行時間是8s,那么兩者的執行效果是一樣的
但是如果任務執行時間大于周期時間呢?
scheduleAtFixedRate會按照周期時間來,即不管任務執行多久,他都是周期一到就重新執行task,
而schedule的下一次開始執行時間是取決與上一次結束時間,如果任務執行時間大于周期時間呢,那么它會按照執行時間為周期執行任務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())); } }
運行結果:
炸彈安裝時間: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())); } }
運行結果
炸彈安裝時間:2016-10-31 20:03:11 炸彈爆炸時間:2016-10-31 20:04:00例子3 延時連環炸彈
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 ......例子4 時間點連環炸彈
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 ......例子5 帶參數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 .....
打賞兩個結果一對比,區別就很明顯了
如果覺得我的文章寫的還過得去的話,有錢就捧個錢場,沒錢給我捧個人場(幫我點贊或推薦一下)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69946.html
摘要:顧名思義,是類型的線程安全原子類,可以在應用程序中以原子的方式更新值。創建對象先來看下對象的創建。也就是說當一個線程修改一個共享變量時,其它線程能立即讀到這個修改的值。 showImg(https://segmentfault.com/img/remote/1460000016012210); 本文首發于一世流云的專欄:https://segmentfault.com/blog... ...
摘要:是不能直接調用系統功能的,所以,我們沒有辦法直接實現多線程程序。通過查看,我們知道了有種方式實現多線程程序。使用的是搶占式調度模型演示如何設置和獲取線程優先級返回線程對象的優先級更改線程的優先級線程默認優先級是。線程優先級的范圍是。 第五階段 多線程 前言: 一個場景:周末,帶著并不存在的女票去看電影,無論是現場買票也好,又或是手機買票也好,上一秒還有位置,遲鈍了一下以后,就顯示該座位...
摘要:案例中的類就是線程獨有對象的代理者參與者參與者會處理多個委托的工作。然而,的實現思路讓每個對象,自身持有一個,這個的就是當前對象,是本地線程變量值。 一、定義 Thread-Specific Storage就是線程獨有的存儲庫,該模式會對每個線程提供獨有的內存空間。java.lang.ThreadLocal類提供了該模式的實現,ThreadLocal的實例是一種集合(collecti...
摘要:另外一種方法是,將這個線程加入一個線程組,在線程組里重寫方法來處理拋出的異常,這時線程組的作用相當于實現了的類。使用對象處理異常格式錯誤使用線程組處理異常測試異常 感性地理解一下什么是線程? 線程這個概念其實是比較抽象的,雖然依照教科書上的說法: 進程是從系統獲取資源的最小單位,線程是程序執行的最小單位。程序是靜態存在于磁盤上的一段文本,進程運行這段文本記錄的命令。 也就是說,進程從系...
時間:2017年05月24日星期三說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學示例源碼:無個人學習源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程介紹 什么是定時任務調度 基于給定的時間點,給定的時間間隔或者給定的執行次數自動執行的任務 在Java中的定時調度工具 Timer:小弟,能實現日常60%的定...
閱讀 3226·2021-11-02 14:44
閱讀 3729·2021-09-02 15:41
閱讀 1671·2019-08-29 16:57
閱讀 1793·2019-08-26 13:38
閱讀 3302·2019-08-23 18:13
閱讀 2111·2019-08-23 15:41
閱讀 1677·2019-08-23 14:24
閱讀 3034·2019-08-23 14:03