2017-04-05 104 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

相關問題