2016-03-07 2 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(); });