Java8의 Completable Future async의 이해

2061 단어 jdk8
유효성 검사 코드는 다음과 같습니다.
ExecutorService executorService = Executors.newFixedThreadPool(3);
        //executorService.submit(new RuleTestRunnable(1));
        List taskList = new ArrayList<>();
        for (int i = 0; i < 30; i++) {
            taskList.add(i);
        }
        CompletableFuture a1 = CompletableFuture.supplyAsync(() -> {
            logger.info("  1{}{}","  ");

            try {
                TimeUnit.MILLISECONDS.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            logger.info("  1{}{}","  ");
            return "1";
        },executorService);
       CompletableFuture a2 = CompletableFuture.supplyAsync(() -> {

            logger.info("  2{}{}","  ");
            try {
                TimeUnit.MILLISECONDS.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            logger.info("  2{}{}","  ");
            return "1";
        },executorService);
        CompletableFuture a= a1.thenCombineAsync(a2,(s1,s2) -> {
            logger.info("    {}{}");
            return  s1+s2;
        },executorService);
        Object result = a.get();

 
executorService 스레드 풀 크기가 2인 경우 다음을 수행합니다.
[pool-4-thread-1] INFO test.rcd.thread.CompletableFutureDemo.lambda$mains$4:127 - 조합 스레드 {} {}
a1.then Combine Async 메서드는 항상 스레드 1 또는 2에 의해 실행됩니다.
executorService 스레드 풀 크기가 3이면 다음과 같은 결과가 발생합니다.
[pool-4-thread-3] INFO test.rcd.thread.CompletableFutureDemo.lambda$mains$4:127 - 조합 스레드 {} {}
a1.then Combine Async 메서드는 항상 스레드 3에 의해 실행됩니다.
a1로 변경thenCombine(), 실행 결과:
a1.then Combine Async 메서드는 항상 스레드 1 또는 2에 의해 실행됩니다.
이를 통해 알 수 있듯이, async 방법은 항상 새로운 라인 실행 방법을 시도하고, async 방법이 없으면 현재 라인에서 라인 실행을 시도합니다.Completable Future는 스레드와 무관한 것 같습니다.
환영하다
교류 방식
QQ:1
 

좋은 웹페이지 즐겨찾기