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

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Java語(yǔ)言中Timer類的簡(jiǎn)潔用法(二)

2019-11-18 10:49:37
字體:
供稿:網(wǎng)友

  實(shí)現(xiàn)計(jì)劃框架
  在上一節(jié),我們學(xué)習(xí)了如何使用計(jì)劃框架,并將它與 java 定時(shí)器框架進(jìn)行了比較。下面,我將向您展示如何實(shí)現(xiàn)這個(gè)框架。除了 清單 3 中展示的 ScheduleIterator 接口,構(gòu)成這個(gè)框架的還有另外兩個(gè)類 —— Scheduler 和 SchedulerTask 。這些類實(shí)際上在內(nèi)部使用 Timer 和 SchedulerTask,因?yàn)橛?jì)劃其實(shí)就是一系列的單次定時(shí)器。
  
  清單 5 和 6 顯示了這兩個(gè)類的源代碼:
  
  清單 5. Scheduler
  
  package org.tiling.scheduling;
  
  import java.util.Date;
  import java.util.Timer;
  import java.util.TimerTask;
  
  public class Scheduler {
  
    class SchedulerTimerTask extends TimerTask {
      PRivate SchedulerTask schedulerTask;
      private ScheduleIterator iterator;
      public SchedulerTimerTask(SchedulerTask schedulerTask,
          ScheduleIterator iterator) {
        this.schedulerTask = schedulerTask;
        this.iterator = iterator;
      }
      public void run() {
        schedulerTask.run();
        reschedule(schedulerTask, iterator);
      }
    }
  
    private final Timer timer = new Timer();
  
    public Scheduler() {
    }
  
    public void cancel() {
      timer.cancel();
    }
  
    public void schedule(SchedulerTask schedulerTask,
        ScheduleIterator iterator) {
  
      Date time = iterator.next();
      if (time == null) {
        schedulerTask.cancel();
      } else {
        synchronized(schedulerTask.lock) {
          if (schedulerTask.state != SchedulerTask.VIRGIN) {
           throw new IllegalStateException("Task already
           scheduled " + "or cancelled");
          }
          schedulerTask.state = SchedulerTask.SCHEDULED;
          schedulerTask.timerTask =
            new SchedulerTimerTask(schedulerTask, iterator);
          timer.schedule(schedulerTask.timerTask, time);
        }
      }
    }
  
    private void reschedule(SchedulerTask schedulerTask,
        ScheduleIterator iterator) {
  
      Date time = iterator.next();
      if (time == null) {
        schedulerTask.cancel();
      } else {
        synchronized(schedulerTask.lock) {
          if (schedulerTask.state != SchedulerTask.CANCELLED) {
            schedulerTask.timerTask =
              new SchedulerTimerTask(schedulerTask, iterator);
            timer.schedule(schedulerTask.timerTask, time);
          }
        }
      }
    }
  
  }
  
  清單 6 顯示了 SchedulerTask 類的源代碼:
  
  package org.tiling.scheduling;
  
  import java.util.TimerTask;
  
  public abstract class SchedulerTask implements Runnable {
  
    final Object lock = new Object();
  
    int state = VIRGIN;
    static final int VIRGIN = 0;
    static final int SCHEDULED = 1;
    static final int CANCELLED = 2;
  
    TimerTask timerTask;
  
    protected SchedulerTask() {
    }
  
    public abstract void run();
  
    public boolean cancel() {
      synchronized(lock) {
        if (timerTask != null) {
          timerTask.cancel();
        }
        boolean result = (state == SCHEDULED);
        state = CANCELLED;
        return result;
      }
    }
  
    public long scheduledExecutionTime() {
      synchronized(lock) {
       return timerTask == null ? 0 : timerTask.scheduledExecutionTime();
      }
    }
  
  }
   就像煮蛋計(jì)時(shí)器,Scheduler 的每一個(gè)實(shí)例都擁有 Timer 的一個(gè)實(shí)例,用于提供底層計(jì)劃。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宜阳县| 垣曲县| 闽清县| 镇雄县| 苗栗县| 彭水| 衡东县| 蒙城县| 文昌市| 日喀则市| 区。| 永清县| 微山县| 辽源市| 巴彦淖尔市| 巨鹿县| 威海市| 准格尔旗| 靖边县| 泰宁县| 武川县| 广宁县| 资兴市| 德钦县| 铜山县| 金平| 正定县| 商河县| 汶川县| 建平县| 闽侯县| 昭觉县| 浮梁县| 长岭县| 平南县| 肥城市| 龙游县| 双柏县| 江津市| 哈巴河县| 玛多县|