2017-04-05 4 views
1

Je vais bien avec les promesses javascript. Je voulais donc essayer Java Futures (toujours coincé dans Java 7). Mais ces Futures Java n'ont pas de sens pour moi. Voici une version modifiée et rognée de journaldev:Java Futures: Quelqu'un pourrait-il m'expliquer le flux du programme

import java.util.concurrent.*; 

public class FutureTest { 
    static class MyCallable implements Callable<String> { 
     private long waitTime; 
     MyCallable(int timeInMillis){ 
      this.waitTime=timeInMillis; 
     } 
     @Override 
     public String call() throws Exception { 
      Thread.sleep(waitTime); 
      return Thread.currentThread().getName(); 
     } 
    } 

    public static void main(String[] args) throws Exception { 
     MyCallable callable1 = new MyCallable(500); 
     MyCallable callable2 = new MyCallable(1000); 
     FutureTask<String> futureTask1 = new FutureTask<String>(callable1); 
     FutureTask<String> futureTask2 = new FutureTask<String>(callable2); 

     ExecutorService executor = Executors.newFixedThreadPool(2); 
     executor.execute(futureTask2); 
     executor.execute(futureTask1); 

     while (true) { 
      try { 
       boolean done1 = futureTask1.isDone(); 
       boolean done2 = futureTask2.isDone(); 

       if(futureTask1.isDone() && futureTask2.isDone()){ 
        System.out.println("Done"); 
        executor.shutdown(); 
        return; 
       } 

       System.out.println("Done1:" + done1 + " - 2:" + done2); 

       String x = futureTask1.get(100L, TimeUnit.MILLISECONDS); 
       if (x != null) 
        System.out.println("FutureTask1 output="+x); 
       else 
        System.out.println("Waiting for FutureTask1"); 

       String s = futureTask2.get(200L, TimeUnit.MILLISECONDS); 
       if(s != null) 
        System.out.println("FutureTask2 output="+s); 
       else 
        System.out.println("Waiting for FutureTask2"); 

       Thread.sleep(100); 
      } catch(TimeoutException e) {} 
     } 
    } 
} 

La sortie est:

Done1:false - 2:false 
Done1:false - 2:false 
Done1:false - 2:false 
Done1:false - 2:false 
Done1:false - 2:false 
FutureTask1 output=pool-1-thread-2 
Done1:true - 2:false 
FutureTask1 output=pool-1-thread-2 
Done1:true - 2:false 
FutureTask1 output=pool-1-thread-2 
FutureTask2 output=pool-1-thread-1 
Done 

Pourquoi le système outs Waiting for FutureTaskX non exécutés? Je m'attendrais à ce que le thread principal boucle et sorte le système Waiting for ... jusqu'à ce que les futurs soient résolus.

Je ne suis pas intéressé par différentes façons de résoudre ce problème, seulement dans le déroulement du programme de ce code. Merci.

+1

* * S'il vous plaît prendre l'habitude d'utiliser des accolades même pour les blocs d'une ligne. Cela vous épargnera beaucoup d'erreurs et sera plus facile à lire pour le reste d'entre nous. – slim

Répondre

1

Le code n'atteint jamais la ligne "Waiting for FutureTask1".

Si futureTask1.get ne renvoie pas de valeur dans le délai imparti, un TimeoutException est renvoyé.

La seule fois qu'il renvoie sans lever une exception, x et s ne sont plus null. Voir le FutureTask get documentation

1

Depuis futureTask1.get(100L, TimeUnit.MILLISECONDS) jetteront TimeoutException, pour le temps de sommeil est futureTask1500 millseconds, futureTask2 a la même question.

Peut-être que vous avez besoin dans la production Waiting for FutureTaskTimeoutException clause de capture et sleep dans le bloc finally, peut-être comme:

try { 
... 
} catch (TimeoutException e) { 
    System.out.println("Waiting for FutureTask"); 
} finally { 
    Thread.sleep(100); 
} 
+0

Ce bloc de prise vide m'a laissé dans l'obscurité. – tokosh