ScheduledExecutorService is used to schedule tasks to run after a delay or at fixed intervals in Java. It is part of the java.util.concurrent package and extends ExecutorService. It helps in managing background and periodic task execution efficiently.
- Executes tasks after delay or periodically
- Uses thread pool for better performance
- More flexible and reliable than Timer
Declaration
public interface ScheduledExecutorService extends ExecutorService
import java.util.concurrent.*;
import java.util.*;
import java.io.*;
class SchedulerExecutorServiceExample {
public static void main(String[] args)
{
System.out.println(
"A count-down-clock program that counts from 10 to 0");
// creating a ScheduledExecutorService object
ScheduledExecutorService scheduler
= Executors.newScheduledThreadPool(11);
// printing the current time
System.out.println(
"Current time : "
+ Calendar.getInstance().get(Calendar.SECOND));
// Scheduling the tasks
for (int i = 10; i >= 0; i--) {
scheduler.schedule(new Task(i), 10 - i,
TimeUnit.SECONDS);
}
// remember to shutdown the scheduler
// so that it no longer accepts
// any new tasks
scheduler.shutdown();
}
}
class Task implements Runnable {
private int num;
public Task(int num) { this.num = num; }
public void run()
{
System.out.println(
"Number " + num + " Current time : "
+ Calendar.getInstance().get(Calendar.SECOND));
}
}
Output:
A count-down-clock program that counts from 10 to 0
Current time : 28
Number 10 Current time : 28
Number 9 Current time : 29
Number 8 Current time : 30
Number 7 Current time : 31
Number 6 Current time : 32
Number 5 Current time : 33
Number 4 Current time : 34
Number 3 Current time : 35
Number 2 Current time : 36
Number 1 Current time : 37
Number 0 Current time : 38
Explanation: This example demonstrates a countdown clock from 10 to 0 using ScheduledExecutorService. A scheduler is created using Executors.newScheduledThreadPool(), and tasks are scheduled with delays of (10 - i) seconds.
Note: Execution time may vary depending on the system clock.
The Hierarchy of ScheduledExecutorService
It extends ExecutorService, which extends Executor, enabling scheduling of tasks with delays or at fixed intervals.

Implementing class: The implementing class of ScheduledExecutorService is ScheduledThreadPoolExecutor.
Creating a ScheduledExecutorService Object
- ScheduledExecutorService is an interface, so it cannot be instantiated directly.
- The Executors class (from java.util.concurrent package) provides factory methods to create its objects.
Factory (Overloaded)Methods of ScheduledExecutorService:
1.newScheduledThreadPool(int corePoolSize)
- Creates a scheduled thread pool with the given corePoolSize
- Returns a ScheduledExecutorService object
- This object can be downcasted to ScheduledThreadPoolExecutor
- Used to: Execute tasks after a delay and Execute tasks periodically
Syntax:
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
2. newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)
- Creates a scheduled thread pool with the given corePoolSize
- Returns a ScheduledExecutorService object
- The ThreadFactory: Is used to create new threads and Allows customization (thread name, priority, etc.)
- Can also be downcasted to ScheduledThreadPoolExecutor
Syntax:
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)
Methods of ScheduledExecutorService
METHOD | DESCRIPTION |
|---|---|
| schedule(Runnable command, long delay, TimeUnit unit) | Submits a one-shot task that becomes enabled after the given delay. |
| schedule(Callable<V> callable, long delay, TimeUnit unit) | Submits a value-returning one-shot task that becomes enabled after the given delay. |
| scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) | Submits a periodic action that becomes enabled first after the given initial delay, and subsequently with the given period; that is, executions will commence after initialDelay, then initialDelay + period, then initialDelay + 2 * period, and so on. |
| scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) | Submits a periodic action that becomes enabled first after the given initial delay, and subsequently with the given delay between the termination of one execution and the commencement of the next. |
Methods declared in interface java.util.concurrent.Executor
METHOD | DESCRIPTION |
|---|---|
| execute(Runnable command) | Executes the given command at some time in the future. |
Methods declared in interface java.util.concurrent.ExecutorService
METHOD | DESCRIPTION |
|---|---|
| awaitTermination(long timeout, TimeUnit unit) | Blocks until all tasks have completed execution after a shutdown request, or the timeout occurs, or the current thread is interrupted, whichever happens first. |
| invokeAll(Collection<? extends Callable<T>> tasks) | Executes the given tasks, returning a list of Futures holding their status and results when all complete. |
| invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) | Executes the given tasks, returning a list of Futures holding their status and results when all complete or the timeout expires, whichever happens first. |
| invokeAny(Collection<? extends Callable<T>> tasks) | Executes the given tasks, returning the result of one that has completed successfully (i.e., without throwing an exception), if any do. |
| invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) | Executes the given tasks, returning the result of one that has completed successfully (i.e., without throwing an exception), if any do before the given timeout elapses. |
| isShutdown() | Returns true if this executor has been shut down. |
| isTerminated() | Returns true if all tasks have completed following shut down. |
| shutdown() | Initiates an orderly shutdown in which previously submitted tasks are executed, but no new tasks will be accepted. |
| shutdownNow() | Attempts to stop all actively executing tasks, halts the processing of waiting tasks, and returns a list of the tasks that were awaiting execution. |
| submit(Runnable task) | Submits a Runnable task for execution and returns a Future representing that task. |
| submit(Runnable task, T result) | Submits a Runnable task for execution and returns a Future representing that task. |
| submit(Callable<T> task) | Submits a value-returning task for execution and returns a Future representing the pending results of the task. |