定时器new Timer().schedule()的使用
文章目錄
- 一、基礎(chǔ)知識(shí)
- 1. 簡(jiǎn)介
- 2. 常用API
- 二、需求案例
- 2.1. 案例1
- 2.2. 案例2
- 2.3. 案例3
- 三、場(chǎng)景案例
- 3.1. 在特定時(shí)間執(zhí)行任務(wù),只執(zhí)行一次
- 3.2. 指定第一次執(zhí)行的時(shí)間,然后按照間隔時(shí)間,重復(fù)執(zhí)行
在開(kāi)發(fā)中,我們經(jīng)常需要一些周期性的操作,例如每隔幾分鐘就進(jìn)行某一項(xiàng)操作。這時(shí)候我們就要去設(shè)置個(gè)定時(shí)器,Java中最方便、最高效的實(shí)現(xiàn)方式是用java.util.Timer工具類(lèi),再通過(guò)調(diào)度java.util.TimerTask任務(wù)。
一、基礎(chǔ)知識(shí)
1. 簡(jiǎn)介
Timer是一種工具,線程用其安排以后在后臺(tái)線程中執(zhí)行的任務(wù)??砂才湃蝿?wù)執(zhí)行一次,或者定期重復(fù)執(zhí)行。實(shí)際上是個(gè)線程,定時(shí)調(diào)度所擁有的TimerTasks。
TimerTask是一個(gè)抽象類(lèi),它的子類(lèi)由 Timer 安排為一次執(zhí)行或重復(fù)執(zhí)行的任務(wù)。實(shí)際上就是一個(gè)擁有run方法的類(lèi),需要定時(shí)執(zhí)行的代碼放到run方法體內(nèi)。
2. 常用API
//以下是幾種常用調(diào)度task的方法: timer.schedule(task, time); // time為Date類(lèi)型:在指定時(shí)間執(zhí)行一次。 timer.schedule(task, firstTime, period); // firstTime為Date類(lèi)型,period為long // 從firstTime時(shí)刻開(kāi)始,每隔period毫秒執(zhí)行一次。 timer.schedule(task, delay) // delay 為long類(lèi)型:從現(xiàn)在起過(guò)delay毫秒執(zhí)行一次 timer.schedule(task, delay, period) // delay為long,period為long:從現(xiàn)在起過(guò)delay毫秒以后,每隔period // 毫秒執(zhí)行一次。二、需求案例
2.1. 案例1
每天定時(shí)12:00執(zhí)行操作,延遲3分鐘后再執(zhí)行第1步:寫(xiě)一個(gè)處理類(lèi),使用timer.schedule(task, firstTime, period);api
package com.gblfy.test;import java.util.Calendar; import java.util.Date; import java.util.Timer;public class G {/*** 每天定時(shí)12:00執(zhí)行操作,延遲3分鐘后再執(zhí)行*/public void timer(){Calendar calendar = Calendar.getInstance();calendar.set(Calendar.HOUR_OF_DAY, 12);//控制小時(shí)calendar.set(Calendar.MINUTE, 0);//控制分鐘calendar.set(Calendar.SECOND, 0);//控制秒Date time = calendar.getTime();//執(zhí)行任務(wù)時(shí)間為12:00:00Timer timer = new Timer();timer.schedule(new TimerTaskTest2(),60 * 3 * 1000);} }第2步:寫(xiě)一個(gè)類(lèi)extends TimerTask實(shí)現(xiàn)run方法,在方法內(nèi)部寫(xiě)需要執(zhí)行的代碼
package com.gblfy.test;import java.util.TimerTask;public class TimerTaskTest2 extends TimerTask {@Overridepublic void run() {System.out.println("... //每次需要執(zhí)行的代碼放到這里面");} }另一種形式不是輸出一句話而是在run方法內(nèi)部調(diào)用一個(gè)自定義方法
package com.gblfy.test;import java.util.TimerTask;public class TimerTaskTest2 extends TimerTask {@Overridepublic void run() {System.out.println("... //每次需要執(zhí)行的代碼放到這里面");Submit();}private void Submit() {System.out.println("-------------自定義方法-------------");} }2.2. 案例2
每天定時(shí)12:00執(zhí)行操作,延遲3分鐘后再執(zhí)行,但是,我需要傳參怎樣辦?第1步:
package com.gblfy.test;import java.util.Calendar; import java.util.Date; import java.util.Timer;public class A {public void timer(String tokenNo) {Calendar calendar = Calendar.getInstance();calendar.set(Calendar.HOUR_OF_DAY, 12);//控制小時(shí)calendar.set(Calendar.MINUTE, 0);//控制分鐘calendar.set(Calendar.SECOND, 0);//控制秒Date time = calendar.getTime();//執(zhí)行任務(wù)時(shí)間為12:00:00Timer timer = new Timer();//每天定時(shí)12:00執(zhí)行操作,延遲3分鐘后再執(zhí)行// timer.schedule(new TimerTaskTest(tokenNo),time,60 * 3 * 1000);// timer.schedule(new TimerTaskTest(tokenNo),60 * 3 * 1000);timer.schedule(new TimerTaskTest(tokenNo), 1 * 1000);}public static void main(String[] args) {A a = new A();String tokenNo="123";a.timer(tokenNo);} }第2步:
package com.gblfy.test;import java.util.TimerTask;public class TimerTaskTest extends TimerTask {private String tokenNo;public TimerTaskTest(String tokenNo) {this.tokenNo = tokenNo;}/*** 此計(jì)時(shí)器任務(wù)要執(zhí)行的操作。*/@Overridepublic void run() {Submit(tokenNo);System.out.println("-------30分鐘之后執(zhí)行指定時(shí)間time執(zhí)行--------");}public void Submit(String tokenNo) {System.out.println("1111111111"+tokenNo);} }2.3. 案例3
延遲3分鐘后再執(zhí)行,但是,我需要傳參怎樣辦?只需要燒寫(xiě)一個(gè)參數(shù)即可
// timer.schedule(new TimerTaskTest(tokenNo),60 * 3 * 1000);為了方便測(cè)試可以寫(xiě)成3秒
timer.schedule(new TimerTaskTest(tokenNo), 3 * 1000);三、場(chǎng)景案例
3.1. 在特定時(shí)間執(zhí)行任務(wù),只執(zhí)行一次
package com.gblfy.test;import java.text.SimpleDateFormat; import java.util.Date; import java.util.Timer; import java.util.TimerTask;public class TimerTime {/*** <p>* 1.停止timer* timer.cancel();* 2.在特定時(shí)間執(zhí)行任務(wù),只執(zhí)行一次* public void schedule(TimerTask task,Date time)* </p>** @param args* @throws Exception*/public static void main(String[] args) throws Exception {new TimerTime().new Time().start();}// 時(shí)間格式SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");// 要執(zhí)行的時(shí)間參數(shù)Date dateTime = new Date("2016/8/13 10:56:00");// 內(nèi)部類(lèi)繼承線程 ,創(chuàng)建一個(gè)新線程。class Time extends Thread {@Overridepublic void run() {final Timer timer = new Timer();timer.schedule(new TimerTask() {// 重寫(xiě)run方法@Overridepublic void run() {System.out.println("I am a cat");timer.cancel();}}, dateTime);}} }3.2. 指定第一次執(zhí)行的時(shí)間,然后按照間隔時(shí)間,重復(fù)執(zhí)行
package com.gblfy.test;import java.text.SimpleDateFormat; import java.util.Date; import java.util.Timer; import java.util.TimerTask;public class TimerTime {/*** <p>* 1.停止timer* timer.cancel();* 2.在特定時(shí)間執(zhí)行任務(wù),只執(zhí)行一次* public void schedule(TimerTask task,Date time)* </p>** @param args* @throws Exception*/public static void main(String[] args) throws Exception {new TimerTime().new Time().start();}// 時(shí)間格式SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");// 要執(zhí)行的時(shí)間參數(shù)Date dateTime = new Date("2016/8/13 10:56:00");// 內(nèi)部類(lèi)繼承線程 ,創(chuàng)建一個(gè)新線程。class Time extends Thread {@Overridepublic void run() {final Timer timer = new Timer();timer.schedule(new TimerTask() {// 重寫(xiě)run方法@Overridepublic void run() {System.out.println("I am a cat");timer.cancel();}}, dateTime);}}/*** 指定第一次執(zhí)行的時(shí)間,然后按照間隔時(shí)間,重復(fù)執(zhí)行* public void schedule(TimerTask task,Date firstTime,long period)** @param task* @param firstTime* @param period*/public void schedule(TimerTask task, Date firstTime, long period)// 示例:// 參照上面的代碼,多傳一個(gè)時(shí)間間隔參數(shù),period單位毫秒class Time2 extends Thread {@Overridepublic void run() {final Timer timer = new Timer();timer.schedule(new TimerTask() {// 重寫(xiě)run方法@Overridepublic void run() {System.out.println("I am a cat");timer.cancel();}}, dateTime,1000 * 1);}} } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的定时器new Timer().schedule()的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux环境安装LFTP_02
- 下一篇: 限制在同一台电脑上只允许有一个用户登录