国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java定時器Timer簡述

2019-11-26 13:16:04
字體:
供稿:網(wǎng)友

概述

主要用于Java線程里指定時間或周期運行任務(wù)。Timer是線程安全的,但不提供實時性(real-time)保證。

構(gòu)造函數(shù)

Timer()

默認(rèn)構(gòu)造函數(shù)。

Timer(boolean)

指定關(guān)聯(lián)線程是否作為daemon線程。

Timer(String)

指定關(guān)聯(lián)線程的名稱。

Timer(String, boolean)

同時指定關(guān)聯(lián)線程的名稱和是否作為daemon。

schdule方法

schedule(TimerTask task, long delay)

以當(dāng)前時間為基準(zhǔn),延遲指定的毫秒后執(zhí)行一次TimerTask任務(wù)。

schedule(TimerTask task, Date time)

在指定的日期執(zhí)行一次TimerTask任務(wù)。

如果日期time早于當(dāng)前時間,則立刻執(zhí)行。

使用示例

public class Demo { private static Timer timer = new Timer(); public static class MyTask extends TimerTask { @Override public void run() {  System.out.println("Run Time:" + new Date().toString()); } } public static void main(String[] args) { try {  MyTask task = new MyTask();  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  String dateStr = "2016-12-27 14:36:00";  Date date = sdf.parse(dateStr);  System.out.println("Date = " + date.toString() + " NowTime = " + new Date().toString());  timer.schedule(task, date); } catch (ParseException e) {  e.printStackTrace(); } }}

執(zhí)行結(jié)果

Date = Tue Dec 27 14:36:00 CST 2016 NowTime = Tue Dec 27 21:28:04 CST 2016Run Time:Tue Dec 27 21:28:04 CST 2016

說明是立刻執(zhí)行。

schedule(TimerTask task, long delay, long period)

以當(dāng)前時間為基準(zhǔn),延遲指定的毫秒后,再按指定的時間間隔地?zé)o限次數(shù)的執(zhí)行TimerTask任務(wù)。(fixed-delay execution)

使用示例

public class Demo { private static Timer timer = new Timer(); public static class MyTask extends TimerTask { @Override public void run() {  System.out.println("Run Time: " + new Date().toString()); } } public static void main(String[] args) { MyTask task = new MyTask(); System.out.println("Now Time: " + new Date().toString()); timer.schedule(task, 3000, 5000); }}

執(zhí)行結(jié)果

Now Time: Tue Dec 27 21:34:59 CST 2016Run Time: Tue Dec 27 21:35:02 CST 2016Run Time: Tue Dec 27 21:35:07 CST 2016Run Time: Tue Dec 27 21:35:12 CST 2016Run Time: Tue Dec 27 21:35:17 CST 2016

說明以當(dāng)前基準(zhǔn)時間延遲3秒后執(zhí)行一次,以后按指定間隔時間5秒無限次數(shù)的執(zhí)行。

schedule(TimerTask task, Date firstTime, long period)

在指定的日期之后,按指定的時間間隔地?zé)o限次數(shù)的執(zhí)行TimerTask任務(wù)。(fixed-delay execution)

如果日期firstTime早于當(dāng)前時間,則立刻執(zhí)行,且不執(zhí)行在時間差內(nèi)的任務(wù)。

使用示例

public class Demo { private static Timer timer = new Timer(); public static class MyTask extends TimerTask { @Override public void run() {  System.out.println("Run Time:" + new Date().toString()); } public static void main(String[] args) {  try {  MyTask task = new MyTask();  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  String dateStr = "2016-12-27 14:36:00";  Date date = sdf.parse(dateStr);  System.out.println("Date = " + date.toString() + " NowTime = " + new Date().toString());  timer.schedule(task, date, 3000);  } catch (ParseException e) {  e.printStackTrace();  } } }}

執(zhí)行結(jié)果

Date = Tue Dec 27 14:36:00 CST 2016 NowTime = Tue Dec 27 21:43:30 CST 2016Run Time:Tue Dec 27 21:43:30 CST 2016Run Time:Tue Dec 27 21:43:33 CST 2016Run Time:Tue Dec 27 21:43:36 CST 2016

說明指定的之間早于當(dāng)前時間,則立刻執(zhí)行,不會補充時間差內(nèi)的任務(wù)

scheduleAtFixedRate方法

scheduleAtFixedRate(TimerTask task, long delay, long period)

以當(dāng)前時間為基準(zhǔn),延遲指定的毫秒后,再按指定的時間間隔周期性地?zé)o限次數(shù)的執(zhí)行TimerTask任務(wù)。(fixed-rate execution)

使用示例

public class Demo { private static Timer timer = new Timer(); public static class MyTask extends TimerTask { @Override public void run() {  System.out.println("Run Time: " + new Date().toString()); } } public static void main(String[] args) { MyTask task = new MyTask(); System.out.println("Now Time: " + new Date().toString()); timer.scheduleAtFixedRate(task, 3000, 5000); }}

執(zhí)行結(jié)果

Now Time: Tue Dec 27 21:58:03 CST 2016Run Time: Tue Dec 27 21:58:06 CST 2016Run Time: Tue Dec 27 21:58:11 CST 2016Run Time: Tue Dec 27 21:58:16 CST 2016Run Time: Tue Dec 27 21:58:21 CST 2016

說明以當(dāng)前基準(zhǔn)時間延遲3秒后執(zhí)行一次,以后按指定間隔時間5秒無限次數(shù)的執(zhí)行。

scheduleAtFixedRate(TimerTask task, Date firstTime, long period)

在指定的日期之后,按指定的時間間隔周期性地?zé)o限次數(shù)的執(zhí)行TimerTask任務(wù)。(fixed-rate execution)

如果日期firstTime早于當(dāng)前時間,則立即執(zhí)行,并補充性的執(zhí)行在時間差內(nèi)的任務(wù)。

使用示例

public class Demo { private static Timer timer = new Timer(); public static class MyTask extends TimerTask { @Override public void run() {  System.out.println("Run Time:" + new Date().toString()); } public static void main(String[] args) {  try {  MyTask task = new MyTask();  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  String dateStr = "2016-12-27 22:02:00";  Date date = sdf.parse(dateStr);  System.out.println("Date = " + date.toString() + " NowTime = " + new Date().toString());  timer.scheduleAtFixedRate(task, date, 5000);  } catch (ParseException e) {  e.printStackTrace();  } } }}

執(zhí)行結(jié)果

Date = Tue Dec 27 22:02:00 CST 2016 NowTime = Tue Dec 27 22:02:54 CST 2016Run Time:Tue Dec 27 22:02:54 CST 2016Run Time:Tue Dec 27 22:02:54 CST 2016Run Time:Tue Dec 27 22:02:54 CST 2016Run Time:Tue Dec 27 22:02:54 CST 2016Run Time:Tue Dec 27 22:02:54 CST 2016Run Time:Tue Dec 27 22:02:54 CST 2016Run Time:Tue Dec 27 22:02:54 CST 2016Run Time:Tue Dec 27 22:02:54 CST 2016Run Time:Tue Dec 27 22:02:54 CST 2016Run Time:Tue Dec 27 22:02:54 CST 2016Run Time:Tue Dec 27 22:02:54 CST 2016Run Time:Tue Dec 27 22:02:55 CST 2016Run Time:Tue Dec 27 22:03:00 CST 2016Run Time:Tue Dec 27 22:03:05 CST 2016

說明指定的之間早于當(dāng)前時間,則立刻執(zhí)行。

在時間22:02:00--22:02:54內(nèi)大約有11個5秒間隔,則優(yōu)先補充性的執(zhí)行在時間差內(nèi)的任務(wù),然后在22:02:55補充完畢(執(zhí)行12次。ps:0-55秒?yún)^(qū)間段內(nèi)首位都算上,正好觸發(fā)12次),此后每隔5秒執(zhí)行一次定時任務(wù)。

執(zhí)行任務(wù)延時對比之 schedule 和 scheduleAtFixedRate

schedule不延時

使用示例

public class Demo { private static Timer timer = new Timer(); private static int runCount = 0; public static class MyTask extends TimerTask { @Override public void run() {  try {  System.out.println("Begin Run Time: " + new Date().toString());  Thread.sleep(3000);  System.out.println("End Run Time: " + new Date().toString());  runCount++;  if (runCount == 3) {   timer.cancel();  }  } catch (InterruptedException e) {  e.printStackTrace();  } } } public static void main(String[] args) { try {  MyTask task = new MyTask();  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  String dateStr = "2016-12-27 14:36:00";  Date date = sdf.parse(dateStr);  System.out.println("Date = " + date.toString() + " NowTime = " + new Date().toString());  timer.schedule(task, date, 5000); } catch (ParseException e) {  e.printStackTrace(); } }}

執(zhí)行結(jié)果

早于當(dāng)前基準(zhǔn)時間

Date = Tue Dec 27 14:36:00 CST 2016 NowTime = Tue Dec 27 22:23:37 CST 2016Begin Run Time: Tue Dec 27 22:23:37 CST 2016End Run Time: Tue Dec 27 22:23:40 CST 2016Begin Run Time: Tue Dec 27 22:23:42 CST 2016End Run Time: Tue Dec 27 22:23:45 CST 2016Begin Run Time: Tue Dec 27 22:23:47 CST 2016End Run Time: Tue Dec 27 22:23:50 CST 2016Process finished with exit code 0

晚于當(dāng)前基準(zhǔn)時間

Date = Tue Dec 27 22:42:00 CST 2016 NowTime = Tue Dec 27 22:41:54 CST 2016Begin Run Time: Tue Dec 27 22:42:00 CST 2016End Run Time: Tue Dec 27 22:42:03 CST 2016Begin Run Time: Tue Dec 27 22:42:05 CST 2016End Run Time: Tue Dec 27 22:42:08 CST 2016Begin Run Time: Tue Dec 27 22:42:10 CST 2016End Run Time: Tue Dec 27 22:42:13 CST 2016Process finished with exit code 0

不管早還是晚于基準(zhǔn)時間,都不進行補償,下一次任務(wù)的執(zhí)行時間參考的是上一次任務(wù)的開始時間點來計算。

schedule延時

使用示例

public class Demo { private static Timer timer = new Timer(); private static int runCount = 0; public static class MyTask extends TimerTask { @Override public void run() {  try {  System.out.println("Begin Run Time: " + new Date().toString());  Thread.sleep(5000);  System.out.println("End Run Time: " + new Date().toString());  runCount++;  if (runCount == 3) {   timer.cancel();  }  } catch (InterruptedException e) {  e.printStackTrace();  } } } public static void main(String[] args) { try {  MyTask task = new MyTask();  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  String dateStr = "2016-12-27 22:42:00";  Date date = sdf.parse(dateStr);  System.out.println("Date = " + date.toString() + " NowTime = " + new Date().toString());  timer.schedule(task, date, 3000); } catch (ParseException e) {  e.printStackTrace(); } }}

執(zhí)行結(jié)果

早于當(dāng)前基準(zhǔn)時間

Date = Tue Dec 27 22:42:00 CST 2016 NowTime = Tue Dec 27 22:45:17 CST 2016Begin Run Time: Tue Dec 27 22:45:17 CST 2016End Run Time: Tue Dec 27 22:45:22 CST 2016Begin Run Time: Tue Dec 27 22:45:22 CST 2016End Run Time: Tue Dec 27 22:45:27 CST 2016Begin Run Time: Tue Dec 27 22:45:27 CST 2016End Run Time: Tue Dec 27 22:45:32 CST 2016Process finished with exit code 0

晚于當(dāng)前基準(zhǔn)時間

Date = Tue Dec 27 22:47:00 CST 2016 NowTime = Tue Dec 27 22:46:27 CST 2016Begin Run Time: Tue Dec 27 22:47:00 CST 2016End Run Time: Tue Dec 27 22:47:05 CST 2016Begin Run Time: Tue Dec 27 22:47:05 CST 2016End Run Time: Tue Dec 27 22:47:10 CST 2016Begin Run Time: Tue Dec 27 22:47:10 CST 2016End Run Time: Tue Dec 27 22:47:15 CST 2016Process finished with exit code 0

不管早還是晚于當(dāng)前基準(zhǔn)時間,都不進行補償,下一次任務(wù)的執(zhí)行時間都是參考上一次任務(wù)結(jié)束的時間點來計算。

scheduleAtFixedRate不延時

使用示例

public class Demo { private static Timer timer = new Timer(); private static int runCount = 0; public static class MyTask extends TimerTask { @Override public void run() {  try {  System.out.println("Begin Run Time: " + new Date().toString());  Thread.sleep(3000);  System.out.println("End Run Time: " + new Date().toString());  runCount++;  if (runCount == 1000) {   timer.cancel();  }  } catch (InterruptedException e) {  e.printStackTrace();  } } } public static void main(String[] args) { try {  MyTask task = new MyTask();  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  String dateStr = "2016-12-27 22:51:42";  Date date = sdf.parse(dateStr);  System.out.println("Date = " + date.toString() + " NowTime = " + new Date().toString());  timer.scheduleAtFixedRate(task, date, 5000); } catch (ParseException e) {  e.printStackTrace(); } }}

執(zhí)行結(jié)果

早于當(dāng)前基準(zhǔn)時間

Date = Tue Dec 27 22:51:42 CST 2016 NowTime = Tue Dec 27 22:51:57 CST 2016Begin Run Time: Tue Dec 27 22:51:57 CST 2016End Run Time: Tue Dec 27 22:52:00 CST 2016Begin Run Time: Tue Dec 27 22:52:00 CST 2016End Run Time: Tue Dec 27 22:52:03 CST 2016Begin Run Time: Tue Dec 27 22:52:03 CST 2016End Run Time: Tue Dec 27 22:52:06 CST 2016Begin Run Time: Tue Dec 27 22:52:06 CST 2016End Run Time: Tue Dec 27 22:52:09 CST 2016Begin Run Time: Tue Dec 27 22:52:09 CST 2016End Run Time: Tue Dec 27 22:52:12 CST 2016Begin Run Time: Tue Dec 27 22:52:12 CST 2016End Run Time: Tue Dec 27 22:52:15 CST 2016Begin Run Time: Tue Dec 27 22:52:15 CST 2016End Run Time: Tue Dec 27 22:52:18 CST 2016Begin Run Time: Tue Dec 27 22:52:18 CST 2016End Run Time: Tue Dec 27 22:52:21 CST 2016Begin Run Time: Tue Dec 27 22:52:22 CST 2016End Run Time: Tue Dec 27 22:52:25 CST 2016Begin Run Time: Tue Dec 27 22:52:27 CST 2016End Run Time: Tue Dec 27 22:52:30 CST 2016Begin Run Time: Tue Dec 27 22:52:32 CST 2016End Run Time: Tue Dec 27 22:52:35 CST 2016Begin Run Time: Tue Dec 27 22:52:37 CST 2016End Run Time: Tue Dec 27 22:52:40 CST 2016Begin Run Time: Tue Dec 27 22:52:42 CST 2016End Run Time: Tue Dec 27 22:52:45 CST 2016Begin Run Time: Tue Dec 27 22:52:47 CST 2016End Run Time: Tue Dec 27 22:52:50 CST 2016Begin Run Time: Tue Dec 27 22:52:52 CST 2016End Run Time: Tue Dec 27 22:52:55 CST 2016Begin Run Time: Tue Dec 27 22:52:57 CST 2016End Run Time: Tue Dec 27 22:53:00 CST 2016Process finished with exit code 0

晚于當(dāng)前基準(zhǔn)時間

Date = Tue Dec 27 22:37:00 CST 2016 NowTime = Tue Dec 27 22:36:06 CST 2016Begin Run Time: Tue Dec 27 22:37:00 CST 2016End Run Time: Tue Dec 27 22:37:03 CST 2016Begin Run Time: Tue Dec 27 22:37:05 CST 2016End Run Time: Tue Dec 27 22:37:08 CST 2016Begin Run Time: Tue Dec 27 22:37:10 CST 2016End Run Time: Tue Dec 27 22:37:13 CST 2016Process finished with exit code 0

不延時的情況下,當(dāng)早于基準(zhǔn)時間時,時間差內(nèi)的執(zhí)行任務(wù)未補償完時,下一次執(zhí)行任務(wù)的時間參考的是上一次執(zhí)行任務(wù)的結(jié)束時間;一旦補償完畢(注意粗體時間點),下一次執(zhí)行任務(wù)的時間參考的是上一次執(zhí)行任務(wù)的開始時間;當(dāng)晚于基準(zhǔn)時間時,下一次執(zhí)行任務(wù)的時間參考的是上一次執(zhí)行任務(wù)的開始時間。

scheduleAtFixedRate延時

使用示例

public class Demo { private static Timer timer = new Timer(); private static int runCount = 0; public static class MyTask extends TimerTask { @Override public void run() {  try {  System.out.println("Begin Run Time: " + new Date().toString());  Thread.sleep(5000);  System.out.println("End Run Time: " + new Date().toString());  runCount++;  if (runCount == 3) {   timer.cancel();  }  } catch (InterruptedException e) {  e.printStackTrace();  } } } public static void main(String[] args) { try {  MyTask task = new MyTask();  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  String dateStr = "2016-12-27 22:28:00";  Date date = sdf.parse(dateStr);  System.out.println("Date = " + date.toString() + " NowTime = " + new Date().toString());  timer.scheduleAtFixedRate(task, date, 3000); } catch (ParseException e) {  e.printStackTrace(); } }}

執(zhí)行結(jié)果

早于當(dāng)前基準(zhǔn)時間

Date = Tue Dec 27 23:01:00 CST 2016 NowTime = Tue Dec 27 23:01:19 CST 2016Begin Run Time: Tue Dec 27 23:01:19 CST 2016End Run Time: Tue Dec 27 23:01:24 CST 2016Begin Run Time: Tue Dec 27 23:01:24 CST 2016End Run Time: Tue Dec 27 23:01:29 CST 2016Begin Run Time: Tue Dec 27 23:01:29 CST 2016End Run Time: Tue Dec 27 23:01:34 CST 2016Begin Run Time: Tue Dec 27 23:01:34 CST 2016End Run Time: Tue Dec 27 23:01:39 CST 2016

晚于當(dāng)前基準(zhǔn)時間

Date = Tue Dec 27 22:28:00 CST 2016 NowTime = Tue Dec 27 22:27:55 CST 2016Begin Run Time: Tue Dec 27 22:28:00 CST 2016End Run Time: Tue Dec 27 22:28:05 CST 2016Begin Run Time: Tue Dec 27 22:28:05 CST 2016End Run Time: Tue Dec 27 22:28:10 CST 2016Begin Run Time: Tue Dec 27 22:28:10 CST 2016End Run Time: Tue Dec 27 22:28:15 CST 2016Process finished with exit code 0

延時的情況下,即使是早于基準(zhǔn)時間,由于延時效應(yīng),根本不可能補償完畢時間差內(nèi)的執(zhí)行任務(wù),故而在延時的情況下,下一次任務(wù)的執(zhí)行時間都是參考上一次任務(wù)結(jié)束的時間來計算。

對比總結(jié)

執(zhí)行任務(wù)不延時 執(zhí)行任務(wù)延時
早于當(dāng)前基準(zhǔn)時間 schedule:下一次任務(wù)的執(zhí)行時間參考的是上一次任務(wù)的開始時間來計算。 scheduleAtFixedRate:當(dāng)早于基準(zhǔn)時間時,時間差內(nèi)的執(zhí)行任務(wù)未補償完時,下一次執(zhí)行任務(wù)的時間參考的是上一次任務(wù)的結(jié)束時間;一旦補償完畢,下一次執(zhí)行任務(wù)的時間參考上一次任務(wù)的開始時間來計算。 二者一樣。下一次任務(wù)的執(zhí)行時間都是參考上一次任務(wù)的結(jié)束時間來計算。
晚于當(dāng)前基準(zhǔn)時間 二者一樣。下一次任務(wù)的執(zhí)行時間參考的是上一次任務(wù)的開始時間來計算。 二者一樣。下一次任務(wù)的執(zhí)行時間都是參考上一次任務(wù)的結(jié)束時間來計算。

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持武林網(wǎng)!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 淅川县| 黑山县| 乌恰县| 吉安市| 浑源县| 涪陵区| 环江| 济源市| 邢台县| 赤壁市| 包头市| 兰西县| 营口市| 桐庐县| 安溪县| 富裕县| 阳高县| 盈江县| 临澧县| 洪泽县| 商洛市| 娄底市| 金平| 隆回县| 霍林郭勒市| 阳城县| 桐庐县| 公主岭市| 淳化县| 晋城| 哈密市| 泾阳县| 平武县| 同仁县| 合阳县| 吕梁市| 临沭县| 错那县| 克什克腾旗| 泰宁县| 成安县|