亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Timer與ScheduledThreadPoolExecutor

2019-11-14 13:11:51
字體:
來源:轉載
供稿:網友

import java.text.SimpleDateFormat;  import java.util.Date;  import java.util.concurrent.ScheduledThreadPoolExecutor;  import java.util.concurrent.TimeUnit;    public class TestScheduledThreadPoolExecutor {        public static void main(String[] args) {                    String time = new SimpleDateFormat("HH:mm:ss").format(new Date());          System.out.PRintln("Start time : " + time);                    ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(5);  //創建5個執行線程                    Runnable runnable = new Runnable() {                            @Override              public void run() {                  // TODO Auto-generated method stub                  String time = new SimpleDateFormat("HH:mm:ss").format(new Date());                  System.out.println("Now Time : "  + time);              }          };                    executor.scheduleWithFixedDelay(runnable, 2, 3, TimeUnit.SECONDS);                }        }  在實際應用中,有時候我們需要創建一些個延遲的、并具有周期性的任務,比如,我們希望當我們的程序啟動后每隔1小時就去做一次日志記錄。在JDK中提供了兩種方法去創建延遲周期性任務。

TimerTimer是java.util包下的一個類,在JDK1.3的時候被引入,Timer只是充當了一個執行者的角色,真正的任務邏輯是通過一個叫做TimerTask的抽象類完成的,TimerTask也是java.util包下面的類,它是一個實現了Runnable接口的抽象類,包含一個抽象方法run( )方法,需要我們自己去提供具體的業務實現。Timer類對象是通過其schedule方法執行TimerTask對象中定義的業務邏輯,并且schedule方法擁有多個重載方法提供不同的延遲與周期性服務。下面是利用Timer去創建的一個延時周期性任務
import java.text.SimpleDateFormat;  import java.util.Date;  import java.util.Timer;  import java.util.TimerTask;    public class TestTimer {        public static void main(String[] args) {                    String time = new SimpleDateFormat("HH:mm:ss").format(new Date());          System.out.println("Start time : " + time);                    Timer timer = new Timer();          TimerTask task = new TimerTask() {                            @Override              public void run() {                  // TODO Auto-generated method stub                  String time = new SimpleDateFormat("HH:mm:ss").format(new Date());                  System.out.println("Now Time : "  + time);              }          }; //end task                    timer.schedule(task, 2000, 3000);                }        }  程序的輸出:Start time : 21:36:08  Now Time : 21:36:10  Now Time : 21:36:13  Now Time : 21:36:16  Now Time : 21:36:19  ScheduledThreadPoolExecutor在JDK1.5的時候在java.util.concurrent并發包下引入了ScheduledThreadPoolExecutor類,引入它的原因是因為Timer類創建的延遲周期性任務存在一些缺陷,ScheduledThreadPoolExecutor繼承了ThreadPoolExecutor,并且實現了ScheduledExecutorService接口,ScheduledThreadPoolExecutor也是通過schedule方法執行Runnable任務的。我們用ScheduledThreadPoolExecutor來實現和上述Timer一樣的功能程序的輸出:Start time : 22:12:25  Now Time : 22:12:27  Now Time : 22:12:30  Now Time : 22:12:33  Now Time : 22:12:36  這樣看來Timer和ScheduledThreadPoolExecutor好像沒有聲明差別,但是ScheduledThreadPoolExecutor的引入正是由于Timer類存在的一些不足,并且在JDK1.5或更高版本中,幾乎沒有利用繼續使用Timer類,下面說明Timer存在的一些缺點。單線程Timer類是通過單線程來執行所有的TimerTask任務的,如果一個任務的執行過程非常耗時,將會導致其他任務的時效性出現問題。而ScheduledThreadPoolExecutor是基于線程池的多線程執行任務,不會存在這樣的問題。這里我們通過讓Timer來執行兩個TimerTask任務來說明,其中一個TimerTask的執行過程是耗時的,加入需要2秒。
import java.text.SimpleDateFormat;  import java.util.Date;  import java.util.Timer;  import java.util.TimerTask;    public class SingleThreadTimer {        public static void main(String[] args) {                    String time = new SimpleDateFormat("HH:mm:ss").format(new Date());          System.out.println("Start time : " + time);                    Timer timer = new Timer();                    TimerTask task1 = new TimerTask() {                            @Override              public void run() {                  // TODO Auto-generated method stub                  String time = new SimpleDateFormat("HH:mm:ss").format(new Date());                  System.out.println("Task1 time : " + time);              }          };                    TimerTask task2 = new TimerTask() {                            @Override              public void run() {                  // TODO Auto-generated method stub                  try {                      Thread.sleep(2000);                  } catch (InterruptedException e) {                      // TODO Auto-generated catch block                      e.printStackTrace();                  }                  String time = new SimpleDateFormat("HH:mm:ss").format(new Date());                  System.out.println("task2 time : " + time);              }          };                    timer.schedule(task1, 2000, 1000);          timer.schedule(task2, 2000, 3000);      }        }  這里定義了兩個任務,任務1,程序啟動2秒后每隔1秒運行一次,任務2,程序啟動2秒后,每隔3秒運行1次,然后讓Timer同時運行這兩個任務程序的輸出如下:Start time : 22:22:37  Task1 time : 22:22:39  task2 time : 22:22:41  Task1 time : 22:22:41  Task1 time : 22:22:42  task2 time : 22:22:44  Task1 time : 22:22:44  Task1 time : 22:22:45  task2 time : 22:22:47  Task1 time : 22:22:47  Task1 time : 22:22:48  可以分析,無論是任務1還是任務2都沒有按照我們設定的預期進行運行,造成這個現象的原因就是Timer類是單線程的。Timer線程不捕獲異常Timer類中是不捕獲異常的,假如一個TimerTask中拋出未檢查異常(P.S:java中異常分為兩類:checked exception(檢查異常)和unchecked exception(未檢查異常),對于未檢查異常也叫RuntimeException(運行時異常). ),Timer類將不會處理這個異常而產生無法預料的錯誤。這樣一個任務拋出異常將會導致整個Timer中的任務都被取消,此時已安排但未執行的TimerTask也永遠不會執行了,新的任務也不能被調度(所謂的“線程泄漏”現象)。下面就已常見的RuntimeException,ArrayIndexOutOfBoundsException數組越界異常,來演示這個缺點:
import java.text.SimpleDateFormat;  import java.util.Date;  import java.util.Timer;  import java.util.TimerTask;    public class TestTimerTask {        public static void main(String[] args) {          System.out.println(new SimpleDateFormat("HH:mm:ss").format(new Date()));          Timer timer = new Timer();          TimerTask task1 = new TimerTask() {                        @Override              public void run() {                  System.out.println("1: " + new SimpleDateFormat("HH:mm:ss").format(new Date()));              }          };                    TimerTask task2 = new TimerTask() {                            @Override              public void run() {                  int[] arr = {1,2,3,4,5};                  try {                      Thread.sleep(1000);                                        } catch (InterruptedException e) {                      e.printStackTrace();                  }                  int index = (int)(Math.random()*100);                  System.out.println(arr[index]);                                    System.out.println("2: " + new SimpleDateFormat("HH:mm:ss").format(new Date()));              }          };                    timer.schedule(task1, 2000, 3000);          timer.schedule(task2, 2000, 1000);                }        }  程序會在運行過程中拋出數組越界異常,并且整個程序都會被終止,原來完好的任務1也被終止了。基于絕對時間Timer類的調度是基于絕對的時間的,而不是相對的時間,因此Timer類對系統時鐘的變化是敏感的,舉個例子,加入你希望任務1每個10秒執行一次,某個時刻,你將系統時間提前了6秒,那么任務1就會在4秒后執行,而不是10秒后。在ScheduledThreadPoolExecutor,任務的調度是基于相對時間的,原因是它在任務的內部存儲了該任務距離下次調度還需要的時間(使用的是基于System#nanoTime實現的相對時間,不會因為系統時間改變而改變,如距離下次執行還有10秒,不會因為將系統時間調前6秒而變成4秒后執行)?;谝陨?個弊端,在JDK1.5或以上版本中,我們幾乎沒有理由繼續使用Timer類,ScheduledThreadPoolExecutor可以很好的去替代Timer類來完成延遲周期性任務。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久免费精品视频| 欧亚精品中文字幕| 国产精品综合网站| 欧美激情一级欧美精品| 国产欧美最新羞羞视频在线观看| 亚洲天堂精品在线| 97欧美精品一区二区三区| 亚洲乱码国产乱码精品精| 久久久久久18| 色噜噜狠狠狠综合曰曰曰| 欧美特级www| 久久亚洲综合国产精品99麻豆精品福利| 欧美另类极品videosbest最新版本| 国产精品香蕉av| 国产精品视频永久免费播放| 欧美在线一区二区三区四| 色噜噜狠狠色综合网图区| 美女精品久久久| 国产偷亚洲偷欧美偷精品| 国产精品久久77777| 日韩电影在线观看永久视频免费网站| 久久久亚洲成人| 伦伦影院午夜日韩欧美限制| 欧美视频免费在线| 欧美影院在线播放| 日本精品性网站在线观看| 中文字幕亚洲欧美日韩高清| 俺去亚洲欧洲欧美日韩| 欧美一区二区三区免费观看| 欧美日韩激情视频| 午夜免费在线观看精品视频| 78色国产精品| 久久手机精品视频| 这里只有视频精品| 国产精品久久久| 最新的欧美黄色| 欧美理论电影在线播放| 国产精品男人的天堂| 亚洲国产精品电影| 国产精品免费久久久久久| 性欧美暴力猛交69hd| 亚洲片在线资源| 国产日韩在线免费| 红桃av永久久久| 久久久久久九九九| 亚洲成人久久一区| 欧美色道久久88综合亚洲精品| 国产亚洲精品日韩| 久久久国产视频| 欧美刺激性大交免费视频| 日韩欧美中文字幕在线播放| 国产成人综合精品在线| 另类天堂视频在线观看| 成人免费观看49www在线观看| 国内精品伊人久久| 在线观看免费高清视频97| 色青青草原桃花久久综合| 欧美日韩在线看| 国产日韩欧美在线观看| 国产亚洲精品一区二555| 亚洲午夜国产成人av电影男同| 成人性生交大片免费看视频直播| 欧美大学生性色视频| 亚洲国产97在线精品一区| 国产午夜精品理论片a级探花| 国产成+人+综合+亚洲欧洲| 国产成人一区二区三区| 亚洲999一在线观看www| 亚洲乱码av中文一区二区| 日韩精品在线影院| 亚洲欧美国产视频| 欧美在线日韩在线| 亚洲区一区二区| 欧美一区二区大胆人体摄影专业网站| 狠狠色狠狠色综合日日小说| 91精品久久久久久久久久久久久久| 高清欧美电影在线| 国产在线98福利播放视频| 日本精品视频在线| 成人在线视频福利| 欧美激情视频网| 亚洲第一视频网| 欧美一级淫片videoshd| 亚洲aⅴ男人的天堂在线观看| 国产一区二区香蕉| 日韩视频免费大全中文字幕| 日韩av片永久免费网站| 海角国产乱辈乱精品视频| 国产999精品久久久影片官网| 久久精品成人一区二区三区| 羞羞色国产精品| 色先锋资源久久综合5566| 一个人看的www欧美| 久久亚洲精品成人| 美女精品久久久| 日韩在线视频观看| 日韩欧美国产网站| 日韩美女写真福利在线观看| 激情懂色av一区av二区av| 性欧美激情精品| 久久久久久这里只有精品| 久久久国产在线视频| www.日韩视频| 2019av中文字幕| 国产精品成人观看视频国产奇米| 日韩视频在线观看免费| 国产精品h片在线播放| 亚洲电影免费观看高清完整版| 亚洲免费中文字幕| 国产精品入口日韩视频大尺度| 日韩中文字幕精品| 亚洲欧美中文字幕在线一区| 中文字幕日韩av| 久久在线精品视频| 久久久精品久久久| 精品无人区乱码1区2区3区在线| 久久精品91久久久久久再现| 国产一区二区日韩| 精品国产91久久久久久| 亚洲精品国产精品久久清纯直播| 九九热这里只有在线精品视| 日韩精品极品在线观看| 久久久精品久久久| 久久久久久美女| 91在线观看免费观看| 91亚洲精品久久久久久久久久久久| 亚洲欧美日韩国产成人| 日韩影视在线观看| 日韩美女在线观看| 久久中文精品视频| 欧美性高潮在线| 91精品视频播放| 久久成年人免费电影| 日韩在线观看免费av| 日韩国产一区三区| 欧美国产亚洲精品久久久8v| 中文字幕免费精品一区高清| 日韩免费av一区二区| 国产网站欧美日韩免费精品在线观看| 亚洲精品免费一区二区三区| 精品亚洲精品福利线在观看| 欧美性猛xxx| 久久久久久成人| 国内精品国产三级国产在线专| 中文字幕精品在线| 欧美极品美女视频网站在线观看免费| 亚洲视频一区二区| 国产亚洲欧美日韩美女| 日日骚久久av| 国产91在线高潮白浆在线观看| 欧美另类极品videosbest最新版本| 另类色图亚洲色图| 影音先锋日韩有码| 久久久91精品| 国产欧美日韩中文字幕在线| 欧美日韩国产999| 欧美日韩中文字幕| 亚洲xxx视频| 久久九九全国免费精品观看| 91精品中国老女人| 亚洲精品www久久久| 国产精品成人在线| 国产一区二区三区视频免费| 亚洲一区二区中文|