2017-04-05 64 views
1

我很好的JavaScript承诺。所以我想试用Java Futures(仍然停留在Java 7中)。但是这些Java期货对我来说没有意义。下面是一个修整和改进的journaldev版本:Java未来:有人可以解释我的程序流程

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

它的输出是:

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 

为什么在Waiting for FutureTaskX系统超时不执行?我希望主线程能够循环和系统输出Waiting for ...,直到期货得到解决。

我对解决这个问题的不同方式不感兴趣,只是在这段代码的程序流程中。谢谢。

+1

*请*获得使用括号甚至一个行块的习惯。它会为你节省很多错误,对于我们其他人来说更容易阅读。 – slim

回答

1

代码永远不会到达“等待FutureTask1”行。

如果futureTask1.get在超时内没有返回值,则会抛出TimeoutException

它返回时没有抛出异常的唯一时间,xs不再为空。

查看FutureTask get documentation

1

由于futureTask1.get(100L, TimeUnit.MILLISECONDS)将抛出TimeoutException,为futureTask1睡眠时间500 millseconds,futureTask2有同样的问题。

也许你需要在TimeoutException catch子句输出Waiting for FutureTasksleepfinally块,也许像:

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

空的catch块在黑暗中留给我。 – tokosh

相关问题