2017-04-05 1 views
1

Mir geht es gut mit Javascript verspricht. Also wollte ich Java Futures ausprobieren (immer noch in Java 7 stecken). Aber diese Java-Futures ergeben für mich keinen Sinn. Hier wird eine getrimmt und modifizierte Version von journaldev:Java Futures: Könnte mir jemand den Programmablauf erklären

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) {} 
     } 
    } 
} 

Die Ausgabe ist:

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 

Warum sind die Waiting for FutureTaskX-System-outs nicht ausgeführt? Ich würde erwarten, dass der Haupt-Thread und System-Out Waiting for ... bis die Futures gelöst sind.

Ich bin nicht an verschiedenen Möglichkeiten zur Lösung dieses Problems interessiert, nur im Programmablauf dieses Codes. Vielen Dank.

+1

* * Bitte in der Gewohnheit von Klammern auch für einzeiligen Bausteine. Es wird Ihnen viele Fehler ersparen und ist für den Rest von uns einfacher zu lesen. – slim

Antwort

1

Der Code erreicht niemals die Zeile "Waiting for FutureTask1".

Wenn futureTask1.get innerhalb des Timeouts keinen Wert zurückgibt, wird TimeoutException ausgelöst.

Die einzige Zeit, die es zurückgibt, ohne eine Ausnahme zu werfen, x und s sind nicht mehr null.

Siehe FutureTask get documentation.

1

Seit futureTask1.get(100L, TimeUnit.MILLISECONDS) wird TimeoutException, für die futureTask1 Schlafzeit werfen ist 500 millseconds, futureTask2 das gleiche Problem hat.

Vielleicht brauchen Sie Ausgang Waiting for FutureTask in TimeoutException catch-Klausel, und sleep in finally Block, vielleicht wie:

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

Dieser leere Fangblock ließ mich im Dunkeln. – tokosh

Verwandte Themen