2016-03-07 389 views
0

这里我调用三个线程,第二个和第三个线程等待第一个线程完成,然后开始并行执行。如果我使用executor.shutdown()那么只执行第一个任务。我想知道如何停止执行后,我的所有线程都执行完毕如何在与CompletableFuture一起使用时关闭执行程序

public static void main(String[] args) { 
     System.out.println("In main");  
     ExecutorService executor = Executors.newFixedThreadPool(3);  
     CompletableFuture<Void> thenCompose = supplyAsync(() -> doTask1(), executor) 
     .thenCompose(resultOf1 -> allOf(
       runAsync(() -> doTask2(resultOf1), executor), 
       runAsync(() -> doTask3(), executor) 
     )); 
     //executor.shutdown();  
     System.out.println("Exiting main"); 
    } 

    private static void doTask3() { 
     for(int i=0; i<5;i++) { 
      try { 
       Thread.sleep(500); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      System.out.print(3); 
     } 

    } 

    private static void doTask2(int num) { 
     for(int i=0; i<5;i++) { 
      try { 
       Thread.sleep(500); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      System.out.print(num); 
     } 

    } 

    private static int doTask1() { 
     for(int i=0; i<5;i++) { 
      try { 
       Thread.sleep(500); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      System.out.print(1); 
     } 
     return 5; 

    } 

输出随着executor.shutdown()

In main 
Exiting main 
11111 

输出而不executor.shutdown()

In main 
Exiting main 
111113535353535 
But the program doesn't terminates. 
+1

我就加入了最后的任务到CompletableFuture'.thenRun尝试(() - > {executor.shutdown(); });' – Nadir

+0

谢谢你,它的工作。你可以发布它作为答案,以便我可以接受它。 – Zeeshan

回答

4

我就加入了最后的任务到CompletableFuture尝试

.thenRun(() -> { executor.shutdown(); });

相关问题