Close

Java - ScheduledFuture Interface

[Last Updated: Oct 4, 2018]

The interface java.util.concurrent.ScheduledFuture<V> extends Future<V> and Delayed interfaces. It represents the result of an asynchronous delayed computation.

Delayed interface represents a delay. Following is its snippet:

package java.util.concurrent;

public interface Delayed extends Comparable<Delayed> {
    long getDelay(TimeUnit unit);
}

All methods in ScheduledExecutorService return ScheduledFuture.

Examples

package com.logicbig.example;

import java.util.concurrent.*;

public class ScheduledFutureExample {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();
        ScheduledFuture<Long> scheduleFuture = ses.schedule(new Callable<Long>() {
            @Override
            public Long call() throws Exception {
                System.out.println("returning result");
                return ThreadLocalRandom.current().nextLong();
            }
        }, 2, TimeUnit.SECONDS);
        //remaining delay
        long delay = scheduleFuture.getDelay(TimeUnit.SECONDS);
        System.out.println("task scheduled");
        System.out.println("remaining delay: " + delay);
        Long result = scheduleFuture.get();
        System.out.println(result);
        ses.shutdown();

    }
}
task scheduled
remaining delay: 1
returning result
-7275867025515256187

The methods ScheduledExecutorService#scheduleAtFixedRate() and ScheduledExecutorService#scheduleWithFixedDelay() repeat the task periodically and both return ScheduledFuture<?>, that means the get() method will always return null for them. These futures, however, can be cancelled based on some condition.

public class ScheduledFuturePeriodicExample {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();
        AtomicLong al = new AtomicLong(0);
        ScheduledFuture<?> scheduleFuture = ses.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                System.out.println("running");
                al.incrementAndGet();
            }
        }, 2, 1, TimeUnit.SECONDS);
        System.out.println("task scheduled");
        Thread.sleep(scheduleFuture.getDelay(TimeUnit.MILLISECONDS));
        while (true) {
            //System.out.println(scheduleFuture.isDone()); will always print false
            Thread.sleep(800);
            long l = al.get();
            System.out.println(l);
            if (l >= 5) {
                System.out.println("cancelling");
                scheduleFuture.cancel(true);
                ses.shutdown();
                break;
            }
        }
    }
}
task scheduled
running
1
running
2
running
3
running
4
running
5
cancelling

Example Project

Dependencies and Technologies Used:

  • JDK 11
  • Maven 3.5.4

ScheduledFuture Examples Select All Download
  • java-scheduled-future-interface
    • src
      • main
        • java
          • com
            • logicbig
              • example
                • ScheduledFutureExample.java

    See Also