Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

Source code: edu/emory/mathcs/util/concurrent/AlarmClock.java


1   /* ***** BEGIN LICENSE BLOCK *****
2    * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3    *
4    * The contents of this file are subject to the Mozilla Public License Version
5    * 1.1 (the "License"); you may not use this file except in compliance with
6    * the License. You may obtain a copy of the License at
7    * http://www.mozilla.org/MPL/
8    *
9    * Software distributed under the License is distributed on an "AS IS" basis,
10   * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11   * for the specific language governing rights and limitations under the
12   * License.
13   *
14   * The Original Code is the Emory Utilities.
15   *
16   * The Initial Developer of the Original Code is
17   * The Distributed Computing Laboratory, Emory University.
18   * Portions created by the Initial Developer are Copyright (C) 2002
19   * the Initial Developer. All Rights Reserved.
20   *
21   * Alternatively, the contents of this file may be used under the terms of
22   * either the GNU General Public License Version 2 or later (the "GPL"), or
23   * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
24   * in which case the provisions of the GPL or the LGPL are applicable instead
25   * of those above. If you wish to allow use of your version of this file only
26   * under the terms of either the GPL or the LGPL, and not to allow others to
27   * use your version of this file under the terms of the MPL, indicate your
28   * decision by deleting the provisions above and replace them with the notice
29   * and other provisions required by the GPL or the LGPL. If you do not delete
30   * the provisions above, a recipient may use your version of this file under
31   * the terms of any one of the MPL, the GPL or the LGPL.
32   *
33   * ***** END LICENSE BLOCK ***** */
34  
35  package edu.emory.mathcs.util.concurrent;
36  
37  import java.util.*;
38  
39  /**
40   * This class provide some value-added over java.util.Timer: that is,
41   * it enables rescheduling of previously scheduled tasks.
42   *
43   * @author Dawid Kurzyniec
44   * @version 1.0
45   */
46  public class AlarmClock {
47      final Timer engine;
48      final Runnable task;
49      TimerTask timerTask;
50  
51      public AlarmClock(Timer engine, Runnable task) {
52          this.engine = engine;
53          this.task = task;
54      }
55  
56      /**
57       * Reschedule previously scheduled task unless it would postpone it.
58       * In other words, if the requested delay is longer than the time remaining
59       * until the previously scheduled execution, the request is ignored.
60       *
61       * @param delay the new delay before the task is to be executed,
62       *              measured from the moment the method is invoked.
63       * @returns true if successful, false otherwise (i.e. if task is already
64       *          running or complete)
65       */
66      public synchronized void setAlarmDelayIfSooner(long delay) {
67          if (delay < 0) {
68              // infinite; can't be more restrictive than anything
69              return;
70          }
71          if (timerTask != null) {
72              long oldDelay = timerTask.scheduledExecutionTime() - System.currentTimeMillis();
73              if (delay >= oldDelay) {
74                  // not more restrictive; ignore request
75                  return;
76              }
77          }
78          setAlarmDelay(delay);
79      }
80  
81      /**
82       * Reschedule previously scheduled task.
83       *
84       * @param delay the new delay before the task is to be executed,
85       *              measured from the moment the method is invoked.
86       * @returns true if successful, false otherwise (i.e. if task is already
87       *          running or complete)
88       */
89      public synchronized boolean setAlarmDelay(long delay) {
90          if (timerTask != null) {
91              if (!cancel()) {
92                  // task is running at the moment
93                  return false;
94              }
95          }
96          // start timer
97          timerTask = new TimerTask() {
98              public void run() {
99                  task.run();
100                 synchronized (AlarmClock.this) {
101                     // job done; suicide
102                     AlarmClock.this.timerTask = null;
103                 }
104             }
105         };
106 
107         engine.schedule(timerTask, delay);
108         return true;
109     }
110 
111     /**
112      * Cancel the scheduled task.
113      *
114      * @return true if successful, false otherwise.
115      * @see TimerTask#cancel
116      */
117     public synchronized boolean cancel() {
118         if (timerTask != null) {
119             boolean result = timerTask.cancel();
120             timerTask = null;
121             return result;
122         }
123         return false;
124     }
125 }