Sobes.tech
Middle

Wat is Future in Java?

sobes.tech AI

Antwoord van AI

Future in Java vertegenwoordigt het resultaat van een asynchrone operatie. Het bevat methoden om te controleren of de operatie voltooid is, te wachten op de voltooiing en het resultaat te verkrijgen.

Belangrijkste methoden:

  • boolean isDone(): Geeft true terug als de taak voltooid is.
  • V get(): Wacht tot de taak voltooid is en geeft het resultaat terug. Als de taak een uitzondering heeft opgeworpen, wordt deze ook door deze methode opgeworpen. Blokkerende aanroep.
  • V get(long timeout, TimeUnit unit): Wacht gedurende de gespecificeerde tijd op de voltooiing van de taak en geeft het resultaat terug. Bij timeout wordt een TimeoutException opgeworpen. Blokkerende aanroep.
  • boolean cancel(boolean mayInterruptIfRunning): Probeert de uitvoering van de taak te annuleren. Geeft false terug als de taak al voltooid is, al geannuleerd is of niet geannuleerd kan worden om andere redenen.
  • boolean isCancelled(): Geeft true terug als de taak is geannuleerd voordat deze normaal werd voltooid.

Future wordt meestal geretourneerd bij het verzenden van een Callable of Runnable naar een ExecutorService.

Voorbeeld van gebruik:

import java.util.concurrent.*;

// Voorbeeld van een Callable die een taak uitvoert
public class MyTask implements Callable<String> {

    private final String name;

    public MyTask(String name) {
        this.name = name;
    }

    @Override
    public String call() {
        try {
            TimeUnit.SECONDS.sleep(2); // Simulatie van langdurig werk
            System.out.println("Taak \"" + name + "\" voltooid");
            return "Resultaat van " + name;
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            return "Taak \"" + name + "\" onderbroken";
        }
    }
}
import java.util.concurrent.*;

public class FutureExample {

    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(2);

        // Verzend de taak en krijg een Future
        Future<String> future = executor.submit(new MyTask("Taak 1"));

        System.out.println("Taak ingediend");

        // Controleer of de taak voltooid is
        while (!future.isDone()) {
            System.out.println("Taak is nog niet klaar...");
            try {
                TimeUnit.MILLISECONDS.sleep(500);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }

        try {
            // Verkrijg het resultaat
            String result = future.get();
            System.out.println("Taak voltooid. Resultaat: " + result);
        } catch (InterruptedException | ExecutionException e) {
            System.err.println("Fout bij uitvoeren van taak: " + e.getMessage());
        } finally {
            executor.shutdown(); // Belangrijk om de ExecutorService af te sluiten
        }
    }
}

Future is een basishulpmiddel. In Java 8 is CompletableFuture geïntroduceerd, dat uitgebreidere mogelijkheden biedt voor het samenstellen en verwerken van asynchrone operaties.