3 votes

Java Future renvoie toujours des résultats nuls

J'ai une petite question sur les Java Futures. J'ai décomposé le problème en cet extrait :

    ExecutorService service = Executors.newCachedThreadPool();
    try {
        System.out.println(service.submit(new FutureTask<>(() -> true)).get());
    } catch (InterruptedException e1) {
        e1.printStackTrace();
    } catch (ExecutionException e1) {
        e1.printStackTrace();
    }

Je m'attends à ce que mon terminal affiche "true". Mais au lieu de cela, il affiche toujours null. Que me manque-t-il ?

3voto

Kayaman Points 12541

C'est le FutureTask qui jette la logique en l'air. Votre () -> true est un Callable<Boolean> en retournant sur true mais FutureTask est un Runnable qui ne renvoie pas de valeur. Par conséquent, submit renvoie un Future<Void> (puisqu'il reçoit un Runnable et non un paramètre Callable ), qui contient toujours null.

Supprimez les éléments inutiles FutureTask et utiliser simplement le Callable directement.

2voto

Vlad Bochenin Points 2352

FutureTask étend Runnable interface

Documentation sur le formulaire java pour ExecutorService.submit(Runnable) méthode :

Soumet une tâche Runnable pour exécution et retourne un Future représentant cette tâche. La méthode {@code get} du Future retournera {@code null} lors succès de achèvement.

pour obtenir le résultat, vous pouvez utiliser Callable :

System.out.println(service.submit(() -> true).get());

ou obtenir le résultat de la tâche :

FutureTask<Boolean> task = new FutureTask<>(() -> true);
service.submit(task);
System.out.println(task.get());

0voto

Jaroslaw Pawlak Points 2512

Le problème est le suivant FutureTask . Si vous appelez votre service avec Callable o Runnable il fonctionne comme prévu et renvoie le résultat :

Future<?> result = service.submit(() -> true);

System.out.println(result.get()); // prints true

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X