1

나는 자바에서 List<List<String>>을 가지고있다. 부모 목록 내부에서리스트를 비동기 적으로 처리하고 싶다. 고정 스레드 풀 예제 3. CompletableFuture와 Stream을 java 8에서 사용하려고한다.이 두 메소드를 병합하는 방법과 이해하는 방법을 모르고있다. . PFB 코드 나는 지금까지 노력했다. 프로세서에서는 인쇄 중이지만 DB 작업을 수행합니다.java에서 CompletableFuture로 List 목록을 처리하는 방법은 무엇입니까?

그래서 여기 List<List<String>> 스트림을 시도하고 목록 크기를 기반으로 스레드 수를 만듭니다. 그러나 괭이는 Streamed List를 CompletableFuture가있는 Processor에 인수로 전달합니다.

public class CompletableFutureWithList { 
    public static void main(String args[]) { 
     List<List<String>> aList = new ArrayList<>(); 
     aList.add(new ArrayList<>(Arrays.asList("xyz", "abc"))); 
     aList.add(new ArrayList<>(Arrays.asList("qwe", "poi"))); 
     System.out.println("helo..."); 
     ExecutorService executor = Executors.newFixedThreadPool(aList.size()); 
     //aList.stream().flatMap(List::stream). 
     Processor aProcessor = new Processor(); 
     List<String> tempList = new ArrayList<>(); 
     CompletableFuture aComFuture = supplyAsync(() -> aProcessor.processList(tempList), executor); 
     try { 
      aComFuture.get(); 
     } catch (InterruptedException | ExecutionException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
public class Processor { 
    public boolean processList(List<String> tempList) { 
     for (String string : tempList) { 
      System.out.println("Output: " + string); 
     } 
     return true; 
    } 
} 
+2

왜 당신이 CompletableFuture을 사용하고 단순히 호출하지 '미래 F = excecutor.submit (() -> PROCESSLIST (목록))'각 목록을 검색 하시나요? – assylias

+0

하나의 스레드 (디버깅하기 쉽다)를 가진 간단한 프로그램을 작성하고이 프로그램을 실행하여 외부 프로세스 인 Apache Commons Exec을 실행할 수있다. – Grzesiek

답변

1

은 그래서 당신은 당신이 무엇을 할 수 있는지 그래서 List<List<String>>

내부에 List<String> 각 프로세서를 호출 할 필요가 이해하는 것과 다음에 모든 대기 CompletableFuture을 사용하여 새 스레드의 모든를 만드는 것입니다 반환 된 값의 처리를 마칩니다.

그래서 당신이 할 수있는 것은 이것이 당신이 목록 completablefuture의 목록을 병합 할 수 있습니다 어떻게이

List<List<String>> aList = new ArrayList<>(); 

//Create all CFs 
List<CompletableFuture<Boolean>> futureList = aList.stream() 
      .map(strings -> CompletableFuture.supplyAsync(() -> processList(strings), executor)) 
      .collect(toList()); 

//Wait for them all to complete 
CompletableFuture.allOf(futureList.toArray(new CompletableFuture[0])).join(); 

//Do processing of the results 
Stream<Boolean> booleanStream = futureList.stream() 
      .map(CompletableFuture::join); 
//Do other stuff you need 
0

같은 것입니다.

public static void main(String args[]) { 
    List<List<String>> aList = new ArrayList<>(); 
    aList.add(new ArrayList<>(Arrays.asList("xyz", "abc"))); 
    aList.add(new ArrayList<>(Arrays.asList("qwe", "poi"))); 
    System.out.println("hello..."); 

    Processor aProcessor = new Processor(); 
    List<String> tempList = new ArrayList<>(); 
    CompletableFuture aComFuture = CompletableFuture.supplyAsync(() -> ""); 

    aList.stream() 
      .forEach(list -> aComFuture.thenApply(fn -> aProcessor.processList(list))); 

    aComFuture.join(); 
} 

static class Processor { 
    public boolean processList(List<String> tempList) { 
     for (String string : tempList) { 
      System.out.println("Output: " + string); 
     } 
     return true; 
    } 
}