Suppose we want to do a task after fixed time interval such as creating a beep sound after 5 seconds or checking the connection status after every 5 seconds. This may be easily accomplished using Executor framework in java.
There is a class called ScheduledThreadPoolExecutor
which has the methods to perform such kind of scheduling. Let’s get down to code right away:
public static void beepAfterInterval() {
//initialize the scheduler service
final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
//schedule a task to execute after every 5 seconds
final ScheduledFuture<?>beeper = scheduler.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
// this is just a sample. Any repeatitive task such as connection
// health monitoring can be done here
System.out.println("Beep");
}
}, 0, 5, TimeUnit.SECONDS);
}
/*
* The above piece of code is sufficient to create a scheduler. Now suppose, if
* we want to stop the scheduler after a definite time, say 10 minutes then
* below piece of code will do that
*/
ses.schedule (new Runnable() {
@Override
public void run() {
beeper.cancel(true);
ses.shutdown();
}
}, 10, TimeUnit.SECONDS);
Let’s tweak in:
1. First create an instance of ScheduledThreadPoolExecutor
class using newScheduledThreadPool
method of Executors class. This method takes a number which defines the size of thread pool to create.
2. This is assigned to a reference of type ScheduledExecutorService
since the signature of newScheduledThreadPool
returns an object of type ScheduledExecutorService
while internally it returns an instance of type ScheduledThreadPoolExecutor
.
3. Now using this reference we call scheduleAtFixedRate
method. This method takes 4 arguments:
a. A runnable object which defines the task to execute.
b. An initialDelay which defines the time after which the supplied task will start to execute the first time.
c. Period which defines the time interval after which the task will repeat itself.
d. Unit of the time interval such as minutes, seconds etc.
4. This method is declared in ScheduledExecutorService
while implemented in ScheduledThreadPoolExecutor
. Remember, ScheduledExecutorService
is an interface while ScheduledThreadPoolExecutor
is a class which implements ScheduledExecutorService
. Quite confusing names :).
5. If an execution takes longer than the time interval for the next task to begin (5 seconds in this case), then the subsequent task will wait for the previous task to end.
6. If an execution of a task raises an exception, then all subsequent tasks are stopped.
7. schedule method executes a particular action after the specified time only once. This method is also declared in ScheduledExecutorService
while implemented in ScheduledThreadPoolExecutor
similar to scheduleAtFixedRate
method and takes the task to execute, time after which to execute and the time unit.