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 ProjectDependencies and Technologies Used:
|