To schedule tasks using ScheduledExecutorService in Java, follow these steps:
1. Create a ScheduledExecutorService
- Use
Executors.newScheduledThreadPool(int corePoolSize)to get an instance ofScheduledExecutorService.corePoolSize: Number of threads to keep in the pool.
2. Schedule Tasks
The ScheduledExecutorService provides three methods for scheduling tasks:
schedule: Schedule a task to run after a specific delay.scheduler.schedule(() -> { System.out.println("Task executed after a delay"); }, delay, TimeUnit.SECONDS);delay: Time to wait before executing the task.
scheduleAtFixedRate: Schedule tasks to start at a fixed rate.scheduler.scheduleAtFixedRate(() -> { System.out.println("Task executed at a fixed rate"); }, initialDelay, period, TimeUnit.SECONDS);initialDelay: The delay before the first execution.period: The interval between successive executions.
scheduleWithFixedDelay: Schedule tasks with a fixed delay between the end of one execution and the start of the next.scheduler.scheduleWithFixedDelay(() -> { System.out.println("Task executed with a delay"); }, initialDelay, delay, TimeUnit.SECONDS);delay: Time to wait between the previous task’s completion and the start of the next.
3. Shut Down the Scheduler
- Always shut down the
ScheduledExecutorServiceonce tasks are no longer needed.shutdown()to initiate an orderly shutdown.shutdownNow()to stop all tasks immediately.
scheduler.shutdown();
Points to Remember:
- Thread Efficiency: Reuse threads from the pool to handle multiple tasks efficiently.
- Exception Handling: If a task throws an exception, that thread may stop entirely. Either implement proper exception handling or use a
ThreadFactoryto manage threads (e.g., restart them). - Fixed Rate vs Fixed Delay:
scheduleAtFixedRate: The interval is measured from the start of one task to the start of the next.scheduleWithFixedDelay: The interval is measured from the end of one task to the start of the next.
Example:
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
// Task to run after 2 seconds
scheduler.schedule(() -> System.out.println("One-time task executed"), 2, TimeUnit.SECONDS);
// Task to run initially after 1 second, then every 3 seconds
scheduler.scheduleAtFixedRate(() -> System.out.println("Fixed rate task"), 1, 3, TimeUnit.SECONDS);
// Task to run initially after 2 seconds, then with a delay of 4 seconds
scheduler.scheduleWithFixedDelay(() -> System.out.println("Fixed delay task"), 2, 4, TimeUnit.SECONDS);
// Shutdown the executor after 15 seconds
scheduler.schedule(() -> {
System.out.println("Shutting down the scheduler");
scheduler.shutdown();
}, 15, TimeUnit.SECONDS);
The above demonstrates how to use ScheduledExecutorService.
