1/*
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
3 *
4 * This code is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License version 2 only, as
6 * published by the Free Software Foundation.  Oracle designates this
7 * particular file as subject to the "Classpath" exception as provided
8 * by Oracle in the LICENSE file that accompanied this code.
9 *
10 * This code is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
13 * version 2 for more details (a copy is included in the LICENSE file that
14 * accompanied this code).
15 *
16 * You should have received a copy of the GNU General Public License version
17 * 2 along with this work; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19 *
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21 * or visit www.oracle.com if you need additional information or have any
22 * questions.
23 */
24
25/*
26 * This file is available under and governed by the GNU General Public
27 * License version 2 only, as published by the Free Software Foundation.
28 * However, the following notice accompanied the original version of this
29 * file:
30 *
31 * Written by Doug Lea with assistance from members of JCP JSR-166
32 * Expert Group and released to the public domain, as explained at
33 * http://creativecommons.org/publicdomain/zero/1.0/
34 */
35
36package java.util.concurrent;
37
38/**
39 * An {@link ExecutorService} that can schedule commands to run after a given
40 * delay, or to execute periodically.
41 *
42 * <p>The {@code schedule} methods create tasks with various delays
43 * and return a task object that can be used to cancel or check
44 * execution. The {@code scheduleAtFixedRate} and
45 * {@code scheduleWithFixedDelay} methods create and execute tasks
46 * that run periodically until cancelled.
47 *
48 * <p>Commands submitted using the {@link Executor#execute(Runnable)}
49 * and {@link ExecutorService} {@code submit} methods are scheduled
50 * with a requested delay of zero. Zero and negative delays (but not
51 * periods) are also allowed in {@code schedule} methods, and are
52 * treated as requests for immediate execution.
53 *
54 * <p>All {@code schedule} methods accept <em>relative</em> delays and
55 * periods as arguments, not absolute times or dates. It is a simple
56 * matter to transform an absolute time represented as a {@link
57 * java.util.Date} to the required form. For example, to schedule at
58 * a certain future {@code date}, you can use: {@code schedule(task,
59 * date.getTime() - System.currentTimeMillis(),
60 * TimeUnit.MILLISECONDS)}. Beware however that expiration of a
61 * relative delay need not coincide with the current {@code Date} at
62 * which the task is enabled due to network time synchronization
63 * protocols, clock drift, or other factors.
64 *
65 * <p>The {@link Executors} class provides convenient factory methods for
66 * the ScheduledExecutorService implementations provided in this package.
67 *
68 * <h3>Usage Example</h3>
69 *
70 * Here is a class with a method that sets up a ScheduledExecutorService
71 * to beep every ten seconds for an hour:
72 *
73 * <pre> {@code
74 * import static java.util.concurrent.TimeUnit.*;
75 * class BeeperControl {
76 *   private final ScheduledExecutorService scheduler =
77 *     Executors.newScheduledThreadPool(1);
78 *
79 *   public void beepForAnHour() {
80 *     final Runnable beeper = new Runnable() {
81 *       public void run() { System.out.println("beep"); }
82 *     };
83 *     final ScheduledFuture<?> beeperHandle =
84 *       scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS);
85 *     scheduler.schedule(new Runnable() {
86 *       public void run() { beeperHandle.cancel(true); }
87 *     }, 60 * 60, SECONDS);
88 *   }
89 * }}</pre>
90 *
91 * @since 1.5
92 * @author Doug Lea
93 */
94public interface ScheduledExecutorService extends ExecutorService {
95
96    /**
97     * Creates and executes a one-shot action that becomes enabled
98     * after the given delay.
99     *
100     * @param command the task to execute
101     * @param delay the time from now to delay execution
102     * @param unit the time unit of the delay parameter
103     * @return a ScheduledFuture representing pending completion of
104     *         the task and whose {@code get()} method will return
105     *         {@code null} upon completion
106     * @throws RejectedExecutionException if the task cannot be
107     *         scheduled for execution
108     * @throws NullPointerException if command is null
109     */
110    public ScheduledFuture<?> schedule(Runnable command,
111                                       long delay, TimeUnit unit);
112
113    /**
114     * Creates and executes a ScheduledFuture that becomes enabled after the
115     * given delay.
116     *
117     * @param callable the function to execute
118     * @param delay the time from now to delay execution
119     * @param unit the time unit of the delay parameter
120     * @param <V> the type of the callable's result
121     * @return a ScheduledFuture that can be used to extract result or cancel
122     * @throws RejectedExecutionException if the task cannot be
123     *         scheduled for execution
124     * @throws NullPointerException if callable is null
125     */
126    public <V> ScheduledFuture<V> schedule(Callable<V> callable,
127                                           long delay, TimeUnit unit);
128
129    /**
130     * Creates and executes a periodic action that becomes enabled first
131     * after the given initial delay, and subsequently with the given
132     * period; that is, executions will commence after
133     * {@code initialDelay}, then {@code initialDelay + period}, then
134     * {@code initialDelay + 2 * period}, and so on.
135     *
136     * <p>The sequence of task executions continues indefinitely until
137     * one of the following exceptional completions occur:
138     * <ul>
139     * <li>The task is {@linkplain Future#cancel explicitly cancelled}
140     * via the returned future.
141     * <li>The executor terminates, also resulting in task cancellation.
142     * <li>An execution of the task throws an exception.  In this case
143     * calling {@link Future#get() get} on the returned future will
144     * throw {@link ExecutionException}.
145     * </ul>
146     * Subsequent executions are suppressed.  Subsequent calls to
147     * {@link Future#isDone isDone()} on the returned future will
148     * return {@code true}.
149     *
150     * <p>If any execution of this task takes longer than its period, then
151     * subsequent executions may start late, but will not concurrently
152     * execute.
153     *
154     * @param command the task to execute
155     * @param initialDelay the time to delay first execution
156     * @param period the period between successive executions
157     * @param unit the time unit of the initialDelay and period parameters
158     * @return a ScheduledFuture representing pending completion of
159     *         the series of repeated tasks.  The future's {@link
160     *         Future#get() get()} method will never return normally,
161     *         and will throw an exception upon task cancellation or
162     *         abnormal termination of a task execution.
163     * @throws RejectedExecutionException if the task cannot be
164     *         scheduled for execution
165     * @throws NullPointerException if command is null
166     * @throws IllegalArgumentException if period less than or equal to zero
167     */
168    public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,
169                                                  long initialDelay,
170                                                  long period,
171                                                  TimeUnit unit);
172
173    /**
174     * Creates and executes a periodic action that becomes enabled first
175     * after the given initial delay, and subsequently with the
176     * given delay between the termination of one execution and the
177     * commencement of the next.
178     *
179     * <p>The sequence of task executions continues indefinitely until
180     * one of the following exceptional completions occur:
181     * <ul>
182     * <li>The task is {@linkplain Future#cancel explicitly cancelled}
183     * via the returned future.
184     * <li>The executor terminates, also resulting in task cancellation.
185     * <li>An execution of the task throws an exception.  In this case
186     * calling {@link Future#get() get} on the returned future will
187     * throw {@link ExecutionException}.
188     * </ul>
189     * Subsequent executions are suppressed.  Subsequent calls to
190     * {@link Future#isDone isDone()} on the returned future will
191     * return {@code true}.
192     *
193     * @param command the task to execute
194     * @param initialDelay the time to delay first execution
195     * @param delay the delay between the termination of one
196     * execution and the commencement of the next
197     * @param unit the time unit of the initialDelay and delay parameters
198     * @return a ScheduledFuture representing pending completion of
199     *         the series of repeated tasks.  The future's {@link
200     *         Future#get() get()} method will never return normally,
201     *         and will throw an exception upon task cancellation or
202     *         abnormal termination of a task execution.
203     * @throws RejectedExecutionException if the task cannot be
204     *         scheduled for execution
205     * @throws NullPointerException if command is null
206     * @throws IllegalArgumentException if delay less than or equal to zero
207     */
208    public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
209                                                     long initialDelay,
210                                                     long delay,
211                                                     TimeUnit unit);
212
213}
214