2016-11-04 41 views
0

我有一個線程池爲10的執行程序服務,我預計會得到10個以3秒分隔的打印語句,但我只收到一條打印輸出語句。我通過了10作爲參數,所以我期待10個線程運行。我如何檢索10個未來的對象?執行程序不返回10個未來對象

public class Demo { 
    private static final ExecutorService executor = Executors.newFixedThreadPool(10); 

    public static void main (String[] args) throws ExecutionException, InterruptedException { 

     ArrayList futureObjects = new ArrayList(); 

     Callable<Integer> task =() -> { 
      try { 
       TimeUnit.SECONDS.sleep(3); 
       return 123; 
      } 
      catch (InterruptedException e) { 
       throw new IllegalStateException("task interrupted", e); 
      } 
     }; 

     System.out.println("Before execution of threads"); 

     Future<Integer> future = executor.submit(task); 

     Integer result = future.get(); 
     futureObjects.add(future.get()); 

     System.out.println("result: " + result); 

     for(Object futures : futureObjects){ 
      System.out.println("Futures in ArrayList: " + futures); 
     } 
    } 

} 

我得到的輸出是:

之前線程的執行

結果:123

期貨的ArrayList:123

+0

你看過我的回答嗎? – developer

+0

是的,謝謝,似乎睡眠只是在開始時暫停,然後一次性吐出10個未來物體的所有輸出。這只是一個觀察而已。 –

回答

2

您實際上已經添加提交給線程池只有一個任務&,因爲其中的一個任務執行&返回。

您需要一起提交多個任務(使用下面的Option1或Option2),以便您可以實際使用線程池(以保持線程繁忙)。

你可以看一下下面的代碼的更新版本:

選項(1):ExecutorService的-的invokeAll():

private static final ExecutorService executor = Executors.newFixedThreadPool(10); 

    public static void main (String[] args) throws ExecutionException, InterruptedException { 

     ArrayList futureObjects = new ArrayList(); 

     Callable<Integer> task =() -> { 
      try { 
       TimeUnit.MILLISECONDS.sleep(100); 
       return 123; 
      } 
      catch (InterruptedException e) { 
       throw new IllegalStateException("task interrupted", e); 
      } 
     }; 

     List<Callable<Integer>> callables = new ArrayList<>(); 
     callables.add(task); 
     callables.add(task); 
     callables.add(task); 
     callables.add(task); 
     //Add other tasks 

     System.out.println("Before execution of threads"); 

     List<Future<Integer>> futures = executor.invokeAll(callables); 

     for(Future future : futures){ 
      System.out.println("Futures in ArrayList: " + future.get()); 
     } 
    } 

選擇(2):ExecutorService的提交( ):

private static final ExecutorService executor = Executors.newFixedThreadPool(10); 

    public static void main (String[] args) throws ExecutionException, InterruptedException { 

     ArrayList futureObjects = new ArrayList(); 

     Callable<Integer> task =() -> { 
      try { 
       TimeUnit.MILLISECONDS.sleep(100); 
       return 123; 
      } 
      catch (InterruptedException e) { 
       throw new IllegalStateException("task interrupted", e); 
      } 
     }; 

     List<Callable<Integer>> callables = new ArrayList<>(); 
     callables.add(task); 
     callables.add(task); 
     callables.add(task); 
     callables.add(task); 
     //Add other tasks 

     List<Future<Integer>> futures = new ArrayList<>(); 
     System.out.println("Before execution of threads"); 

     for(Callable<Integer> callable : callables) { 
      futures.add(executor.submit(callable)); 
     } 

     for(Future future : futures){ 
      System.out.println("Futures in ArrayList: " + future.get()); 
     } 
    } 

你可以參考API here

1

創建Executor將嘗試執行任務在10個並行線程中,但每個提交的任務只會執行一次。