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

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

Java語言中Timer類的簡潔用法(一)

2019-11-18 10:49:34
字體:
來源:轉載
供稿:網友

  所有類型的 java 應用程序一般都需要計劃重復執行的任務。企業應用程序需要計劃每日的日志或者晚間批處理過程。一個 J2SE 或者 J2ME 日歷應用程序需要根據用戶的約定計劃鬧鈴時間。不過,標準的調度類 Timer 和 TimerTask 沒有足夠的靈活性,無法支持通常需要的計劃任務類型。在本文中,Java 開發人員 Tom White 向您展示了如何構建一個簡單通用的計劃框架,以用于執行任意復雜的計劃任務。
  
  我將把 java.util.Timer 和 java.util.TimerTask 統稱為 Java 計時器框架,它們使程序員可以很輕易地計劃簡單的任務(注重這些類也可用于 J2ME 中)。在 Java 2 SDK, Standard Edition, Version 1.3 中引入這個框架之前,開發人員必須編寫自己的調度程序,這需要花費很大精力來處理線程和復雜的 Object.wait() 方法。不過,Java 計時器框架沒有足夠的能力來滿足許多應用程序的計劃要求。甚至一項需要在天天同一時間重復執行的任務,也不能直接使用 Timer 來計劃,因為在夏令時開始和結束時會出現時間跳躍。
  
  本文展示了一個通用的 Timer 和 TimerTask 計劃框架,從而答應更靈活的計劃任務。這個框架非常簡單 —— 它包括兩個類和一個接口 —— 并且輕易把握。假如您習慣于使用 Java 定時器框架,那么您應該可以很快地把握這個計劃框架。
  
  計劃單次任務
  計劃框架建立在 Java 定時器框架類的基礎之上。因此,在解釋如何使用計劃框架以及如何實現它之前,我們將首先看看如何用這些類進行計劃。
  
  想像一個煮蛋計時器,在數分鐘之后(這時蛋煮好了)它會發出聲音提醒您。清單 1 中的代碼構成了一個簡單的煮蛋計時器的基本結構,它用 Java 語言編寫:
  
  清單 1. EggTimer 類
  
  package org.tiling.scheduling.examples;
  
  import java.util.Timer;
  import java.util.TimerTask;
  
  public class EggTimer {
    PRivate final Timer timer = new Timer();
    private final int minutes;
  
    public EggTimer(int minutes) {
      this.minutes = minutes;
    }
  
    public void start() {
      timer.schedule(new TimerTask() {
        public void run() {
          playSound();
          timer.cancel();
        }
        private void playSound() {
          System.out.println("Your egg is ready!");
          // Start a new thread to play a sound...
        }
      }, minutes * 60 * 1000);
    }
  
    public static void main(String[] args) {
      EggTimer eggTimer = new EggTimer(2);
      eggTimer.start();
    }
  
  }
  EggTimer 實例擁有一個 Timer 實例,用于提供必要的計劃。用 start() 方法啟動煮蛋計時器后,它就計劃了一個 TimerTask,在指定的分鐘數之后執行。時間到了,Timer 就在后臺調用 TimerTask 的 start() 方法,這會使它發出聲音。在取消計時器后這個應用程序就會中止。
  
  計劃重復執行的任務
  通過指定一個固定的執行頻率或者固定的執行時間間隔,Timer 可以對重復執行的任務進行計劃。不過,有許多應用程序要求更復雜的計劃。例如,天天清晨在同一時間發出叫醒鈴聲的鬧鐘不能簡單地使用固定的計劃頻率 86400000 毫秒(24 小時),因為在鐘撥快或者撥慢(假如您的時區使用夏令時)的那些天里,叫醒可能過晚或者過早。解決方案是使用日歷算法計算每日事件下一次計劃發生的時間。而這正是計劃框架所支持的。考慮清單 2 中的 AlarmClock 實現:
  
  清單 2. AlarmClock 類
  
  package org.tiling.scheduling.examples;
  
  import java.text.SimpleDateFormat;
  
  import java.util.Date;
  
  import org.tiling.scheduling.Scheduler;
  import org.tiling.scheduling.SchedulerTask;
  import org.tiling.scheduling.examples.iterators.DailyIterator;
  
  public class AlarmClock {
  
    private final Scheduler scheduler = new Scheduler();
    private final SimpleDateFormat dateFormat =
      new SimpleDateFormat("dd MMM yyyy HH:mm:ss.SSS");
    private final int hourOfDay, minute, second;
  
    public AlarmClock(int hourOfDay, int minute, int second) {
      this.hourOfDay = hourOfDay;
      this.minute = minute;
      this.second = second;
    }
  
    public void start() {
      scheduler.schedule(new SchedulerTask() {
        public void run() {
          soundAlarm();
        }
        private void soundAlarm() {
          System.out.println("Wake up! " +
            "It's " + dateFormat.format(new Date()));
          // Start a new thread to sound an alarm...
        }
      }, new DailyIterator(hourOfDay, minute, second));
    }
  
    public static void main(String[] args) {
      AlarmClock alarmClock = new AlarmClock(7, 0, 0);
      alarmClock.start();
    }
  }
  注重這段代碼與煮蛋計時器應用程序非常相似。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 乌兰察布市| 宁城县| 塔河县| 奉化市| 胶南市| 红原县| 常熟市| 马公市| 永年县| 阿克陶县| 滕州市| 郸城县| 黄梅县| 湘阴县| 南澳县| 绥江县| 宁阳县| 五原县| 涿州市| 东莞市| 鞍山市| 加查县| 马边| 临城县| 乌兰察布市| 三门县| 寿光市| 同江市| 恩施市| 北海市| 泗阳县| 海淀区| 泸水县| 仙居县| 延安市| 平乡县| 曲周县| 高雄市| 雷山县| 阿合奇县| 巴彦淖尔市|