欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Java多線程定時(shí)器Timer原理的示例分析-創(chuàng)新互聯(lián)

這篇文章給大家分享的是有關(guān)Java多線程定時(shí)器Timer原理的示例分析的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

為曲江等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及曲江網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、曲江網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

Timer的schedule(TimeTask task, Date time)的使用

該方法的作用是在執(zhí)行的日期執(zhí)行一次任務(wù)

1、執(zhí)行任務(wù)的時(shí)間晚于當(dāng)前時(shí)間:未來執(zhí)行

private static Timer timer = new Timer();
static public class MyTask extends TimerTask
{
  public void run()
  {
    System.out.println("運(yùn)行了!時(shí)間為:" + new Date());
  }
}
public static void main(String[] args) throws Exception
{
  MyTask task = new MyTask();
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  String dateString = "2015-10-6 12:14:00";
  Date dateRef = sdf.parse(dateString);
  System.out.println("字符串時(shí)間:" + dateRef.toLocaleString() + " 當(dāng)前時(shí)間:" + new Date().toLocaleString());
  timer.schedule(task, dateRef);
}

看一下運(yùn)行效果:

字符串時(shí)間:2015-10-6 12:14:00 當(dāng)前時(shí)間:2015-10-6 12:13:23
運(yùn)行了!時(shí)間為:Tue Oct 06 12:14:00 CST 2015

執(zhí)行時(shí)間和但前時(shí)間不一致,而是和dateRef的時(shí)間一直,證明了未來執(zhí)行。任務(wù)雖然執(zhí)行完了,但進(jìn)程沒有銷毀,控制臺(tái)上的方框可以看到還是紅色的,看下Timer的源代碼:

public Timer() {
  this("Timer-" + serialNumber());
}
public Timer(String name) {
  thread.setName(name);
  thread.start();
}

所以,啟動(dòng)一個(gè)Timer就是啟動(dòng)一個(gè)新線程,但是這個(gè)新線程并不是守護(hù)線程,所以它會(huì)一直運(yùn)行。要運(yùn)行完就讓進(jìn)程停止的話,設(shè)置Timer為守護(hù)線程就好了,有專門的構(gòu)造函數(shù)可以設(shè)置:

public Timer(boolean isDaemon) {
  this("Timer-" + serialNumber(), isDaemon);
}
public Timer(String name, boolean isDaemon) {
  thread.setName(name);
  thread.setDaemon(isDaemon);
  thread.start();
}

2、計(jì)劃時(shí)間早于當(dāng)前時(shí)間:立即執(zhí)行

如果執(zhí)行任務(wù)的時(shí)間早于當(dāng)前時(shí)間,那么立即執(zhí)行task的任務(wù):

private static Timer timer = new Timer();
static public class MyTask extends TimerTask
{
  public void run()
  {
    System.out.println("運(yùn)行了!時(shí)間為:" + new Date());
  }
}
public static void main(String[] args) throws Exception
{
  MyTask task = new MyTask();
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  String dateString = "2014-10-6 12:14:00";
  Date dateRef = sdf.parse(dateString);
  System.out.println("字符串時(shí)間:" + dateRef.toLocaleString() + " 當(dāng)前時(shí)間:" + new Date().toLocaleString());
  timer.schedule(task, dateRef);
}

看一下運(yùn)行效果:

字符串時(shí)間:2014-10-6 12:14:00 當(dāng)前時(shí)間:2015-10-6 12:20:10
運(yùn)行了!時(shí)間為:Tue Oct 06 12:20:10 CST 2015

執(zhí)行時(shí)間和當(dāng)前時(shí)間一致,證明了立即執(zhí)行

3、多個(gè)TimerTask任務(wù)執(zhí)行

Timer中允許有多個(gè)任務(wù):

private static Timer timer = new Timer();
static public class MyTask extends TimerTask
{
  public void run()
  {
    System.out.println("運(yùn)行了!時(shí)間為:" + new Date());
  }
}
public static void main(String[] args) throws Exception
{
  MyTask task1 = new MyTask();
  MyTask task2 = new MyTask();
  SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  String dateString1 = "2015-10-6 12:26:00";
  String dateString2 = "2015-10-6 12:27:00";
  Date dateRef1 = sdf1.parse(dateString1);
  Date dateRef2 = sdf2.parse(dateString2);
  System.out.println("字符串時(shí)間:" + dateRef1.toLocaleString() + " 當(dāng)前時(shí)間:" + new Date().toLocaleString());
  System.out.println("字符串時(shí)間:" + dateRef2.toLocaleString() + " 當(dāng)前時(shí)間:" + new Date().toLocaleString());
  timer.schedule(task1, dateRef1);
  timer.schedule(task2, dateRef2);
}

看一下運(yùn)行結(jié)果:

字符串時(shí)間:2015-10-612:26:00當(dāng)前時(shí)間:2015-10-612:25:38

字符串時(shí)間:2015-10-612:27:00當(dāng)前時(shí)間:2015-10-612:25:38

運(yùn)行了!時(shí)間為:TueOct0612:26:00CST2015

運(yùn)行了!時(shí)間為:TueOct0612:27:00CST2015

可以看到,運(yùn)行時(shí)間和設(shè)置的時(shí)間一致,證明了未來可以執(zhí)行多個(gè)任務(wù)。另外注意,Task是以隊(duì)列的方式一個(gè)一個(gè)被順序執(zhí)行的,所以執(zhí)行的時(shí)間有可能和預(yù)期的時(shí)間不一致,因?yàn)榍懊娴娜蝿?wù)可能消耗過長(zhǎng),后面任務(wù)的運(yùn)行時(shí)間也有可能被延遲。

代碼就不寫了,舉個(gè)例子,任務(wù)1計(jì)劃12:00:00被執(zhí)行,任務(wù)2計(jì)劃12:00:10被執(zhí)行,結(jié)果任務(wù)1執(zhí)行了30秒,那么任務(wù)2將在12:00:30被執(zhí)行,因?yàn)門ask是被放入隊(duì)列中的,因此必須一個(gè)一個(gè)順序運(yùn)行。

Timer的schedule(TimerTasktask,DatefirstTime,longperiod)

該方法的作用是在指定的日期之后,按指定的間隔周期性地?zé)o限循環(huán)地執(zhí)行某一人物

1、計(jì)劃時(shí)間晚于當(dāng)前時(shí)間:未來執(zhí)行

static public class MyTask extends TimerTask
{
  public void run()
  {
    System.out.println("運(yùn)行了!時(shí)間為:" + new Date());
  }
}
public static void main(String[] args) throws Exception
{
  MyTask task = new MyTask();
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  String dateString = "2015-10-6 18:00:00";
  Timer timer = new Timer();
  Date dateRef = sdf.parse(dateString);
  System.out.println("字符串時(shí)間:" + dateRef.toLocaleString() + " 當(dāng)前時(shí)間:" + new Date().toLocaleString());
  timer.schedule(task, dateRef, 4000);
}

看一下運(yùn)行結(jié)果:

字符串時(shí)間:2015-10-6 18:01:00 當(dāng)前時(shí)間:2015-10-6 18:00:15
運(yùn)行了!時(shí)間為:Tue Oct 06 18:01:00 CST 2015
運(yùn)行了!時(shí)間為:Tue Oct 06 18:01:04 CST 2015
運(yùn)行了!時(shí)間為:Tue Oct 06 18:01:08 CST 2015
運(yùn)行了!時(shí)間為:Tue Oct 06 18:01:12 CST 2015
...

看到從設(shè)定的時(shí)間開始,每隔4秒打印一次,無限打印下去

2、計(jì)劃時(shí)間早于當(dāng)前時(shí)間:立即執(zhí)行

static public class MyTask extends TimerTask
{
  public void run()
  {
    System.out.println("運(yùn)行了!時(shí)間為:" + new Date());
  }
}
public static void main(String[] args) throws Exception
{
  MyTask task = new MyTask();
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  String dateString = "2014-10-6 18:01:00";
  Timer timer = new Timer();
  Date dateRef = sdf.parse(dateString);
  System.out.println("字符串時(shí)間:" + dateRef.toLocaleString() + " 當(dāng)前時(shí)間:" + new Date().toLocaleString());
  timer.schedule(task, dateRef, 4000);
}

看一下運(yùn)行結(jié)果:

字符串時(shí)間:2014-10-6 18:01:00 當(dāng)前時(shí)間:2015-10-6 18:02:46
運(yùn)行了!時(shí)間為:Tue Oct 06 18:02:46 CST 2015
運(yùn)行了!時(shí)間為:Tue Oct 06 18:02:50 CST 2015
運(yùn)行了!時(shí)間為:Tue Oct 06 18:02:54 CST 2015
運(yùn)行了!時(shí)間為:Tue Oct 06 18:02:58 CST 2015
運(yùn)行了!時(shí)間為:Tue Oct 06 18:03:02 CST 2015
...

看到運(yùn)行時(shí)間比當(dāng)前時(shí)間早,從當(dāng)前時(shí)間開始,每隔4秒打印一次,無限循環(huán)下去

TimerTask的cancel()方法

TimerTask的cancel()方法的作用是將自身從任務(wù)隊(duì)列中清除:

static public class MyTaskA extends TimerTask
{
  public void run()
  {
    System.out.println("A運(yùn)行了!時(shí)間為:" + new Date());
    this.cancel();
  }
}
  
static public class MyTaskB extends TimerTask
{
  public void run()
  {
    System.out.println("B運(yùn)行了!時(shí)間為:" + new Date());
  }
}
  
public static void main(String[] args) throws Exception
{
  MyTaskA taskA = new MyTaskA();
  MyTaskB taskB = new MyTaskB();
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  String dateString = "2015-10-6 18:10:00";
  Timer timer = new Timer();
  Date dateRef = sdf.parse(dateString);
  System.out.println("字符串時(shí)間:" + dateRef.toLocaleString() + " 當(dāng)前時(shí)間:" + new Date().toLocaleString());
  timer.schedule(taskA, dateRef, 4000);
  timer.schedule(taskB, dateRef, 4000);  
}

看一下運(yùn)行結(jié)果:

字符串時(shí)間:2015-10-6 18:10:00 當(dāng)前時(shí)間:2015-10-6 18:09:47
A運(yùn)行了!時(shí)間為:Tue Oct 06 18:10:00 CST 2015
B運(yùn)行了!時(shí)間為:Tue Oct 06 18:10:00 CST 2015
B運(yùn)行了!時(shí)間為:Tue Oct 06 18:10:04 CST 2015
B運(yùn)行了!時(shí)間為:Tue Oct 06 18:10:08 CST 2015
B運(yùn)行了!時(shí)間為:Tue Oct 06 18:10:12 CST 2015
...

看到TimeTask的cancel()方法是將自身從任務(wù)隊(duì)列中被移除,其他任務(wù)不受影響

Timer的cancel()方法

把上面代碼改動(dòng)一下:

private static Timer timer = new Timer();
  
static public class MyTaskA extends TimerTask
{
  public void run()
  {
    System.out.println("A運(yùn)行了!時(shí)間為:" + new Date());
    timer.cancel();
  }
}
  
static public class MyTaskB extends TimerTask
{
  public void run()
  {
    System.out.println("B運(yùn)行了!時(shí)間為:" + new Date());
  }
}
  
public static void main(String[] args) throws Exception
{
  MyTaskA taskA = new MyTaskA();
  MyTaskB taskB = new MyTaskB();
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  String dateString = "2015-10-6 18:10:00";
  Date dateRef = sdf.parse(dateString);
  System.out.println("字符串時(shí)間:" + dateRef.toLocaleString() + " 當(dāng)前時(shí)間:" + new Date().toLocaleString());
  timer.schedule(taskA, dateRef, 4000);
  timer.schedule(taskB, dateRef, 4000);
}

看一下運(yùn)行結(jié)果:

字符串時(shí)間:2015-10-618:10:00當(dāng)前時(shí)間:2015-10-618:14:15

A運(yùn)行了!時(shí)間為:TueOct0618:14:15CST2015

全部任務(wù)都被清除,并且進(jìn)程被銷毀。不過注意一下,cancel()方法未必一定會(huì)停止執(zhí)行計(jì)劃任務(wù),可能正常執(zhí)行,因?yàn)閏ancel()方法會(huì)嘗試去獲取queue鎖,如果并沒有獲取到queue鎖的話,TimerTask類中的任務(wù)繼續(xù)執(zhí)行也是完全有可能的

其他方法

再列舉一些Timer中的其他schedule的重載方法的作用,就不提供證明的代碼了,可以自己嘗試一下:

1、schedule(TimerTasktask,longdelay)

以當(dāng)前時(shí)間為參考,在此時(shí)間基礎(chǔ)上延遲指定的毫秒數(shù)后執(zhí)行一次TimerTask任務(wù)

2、schedule(TimerTasktask,longdelay,longperiod)

以當(dāng)前時(shí)間為參考,在此時(shí)間基礎(chǔ)上延遲指定的毫秒數(shù)后,以period為循環(huán)周期,循環(huán)執(zhí)行TimerTask任務(wù)

3、scheduleAtFixedRate(TimerTasktask,DatefirstTime,longperiod)

在延時(shí)的場(chǎng)景下,schedule方法和scheduleAtFixedRate方法沒有區(qū)別,它們的區(qū)別只是在非延時(shí)上。如果執(zhí)行任務(wù)的時(shí)間沒有被延時(shí),對(duì)于schedule方法來說,下一次任務(wù)執(zhí)行的時(shí)間參考的是上一次任務(wù)的開始時(shí)間來計(jì)算的;對(duì)于scheduleAtFixedRate方法來說,下一次任務(wù)執(zhí)行的時(shí)間參考的是上一次任務(wù)的結(jié)束時(shí)間來計(jì)算的

感謝各位的閱讀!關(guān)于“Java多線程定時(shí)器Timer原理的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

當(dāng)前文章:Java多線程定時(shí)器Timer原理的示例分析-創(chuàng)新互聯(lián)
分享鏈接:http://aaarwkj.com/article40/pgsho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、網(wǎng)站策劃全網(wǎng)營(yíng)銷推廣、靜態(tài)網(wǎng)站、自適應(yīng)網(wǎng)站、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)
欧美日韩亚洲一区二区搜索| 白白色手机视频免费看| 免费又色又爽无遮挡网站| 丰满人妻熟妇乱精品视频| 亚洲综合福利视频网站| 天天躁人人躁夜夜躁狠狠躁| 蜜臀av人妻一区二区三区 | 亚洲一区二区三区四区国产| 97在线亚洲欧美视频| 亚欧熟女乱色一二三区日韩| 亚洲一区制服无码中文| 日本高清有码中文字幕| 日韩精品一区二区三区欲色av| 国产免费高清视频成人| 大秀视频一区二区三区| 日韩中文字幕久久中文字幕| 亚洲无综合素人在线观看| 国产黄片免费看久久久| 日韩av在线播放亚洲天堂| 久久精品一区二区三区乱码| 久久亚洲中文字幕精品熟女| 亭亭丁香激情五月涩久久| 人妻乱人伦中文字幕在线| 日韩精选视频在线播放| 日本成人一区二区在线播放| 日韩精品极品在线免费视频| 欧美亚洲另类在线日韩国产| 婷婷国产综合一区二区三区| 黄色av链接在线观看| 一区二区尤物区亚洲国产精品区| 国产亚洲视频一区二区观看| 中文字幕日韩欧美一区| 久久热视频这里有精品| 日韩黄av在线免费观看| 亚洲另类欧美日韩中文字幕| 美女被男人操国产精品| 国产极品嫩模91精品| 国产区精品福利在线熟女| 2023天天操夜夜操| 亚洲av成人在线播放| 中文精品字幕人妻熟女小妇|