250x250
250x250
JinSeopKim
Hello World!
JinSeopKim
전체 방문자
오늘
어제
  • 분류 전체보기 (168)
    • Artificial intelligence (14)
      • DeepDiveToAI (3)
      • Pytorch (3)
      • Etc (8)
    • Back-end (19)
      • Spring (10)
      • JPA (9)
    • Language (24)
      • Python (3)
      • Java (11)
      • Swift (10)
    • Math (4)
      • Linear Algebra (4)
    • CodingTest (79)
      • Algolithm (12)
      • Backjoon (25)
      • Programmers (42)
    • Etc (27)
      • Book Review (3)
      • Adsp (6)
      • Life (2)
      • Docker (1)
      • odds and ends (15)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • GitHub

인기 글

태그

  • uArm
  • BFS
  • 문제풀이
  • 개발자
  • 알고리즘
  • certificate
  • 프로그래머스
  • swift
  • SpringMVC
  • data
  • AI
  • 카카오
  • 구현
  • BOJ
  • java
  • JAVA8
  • 머신러닝
  • 파이썬
  • Front-end
  • ios
  • 브루트포스
  • JPA
  • 코딩테스트
  • DP
  • 개발
  • 자바
  • 선형대수
  • Python
  • 백준
  • ADsP

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
JinSeopKim

Hello World!

자바 쓰레드 Callable과 Future
Language/Java

자바 쓰레드 Callable과 Future

2022. 3. 3. 00:12
728x90
728x90

Callable과 Future

Runnable로 동작을 실행할 때 return받는 값이 없다. 따라서 쓰레드를 처리하고 그 결과로 값을 얻어야한다면 Runnable을 사용하면 안된다.
Callable은 제너릭타입을 리턴타입으로 갖고 있기 때문에 return타입이 필요하다면 Callable사용하면 된다.

Future는 이렇게 동작하는 비동기 작업의 현재상태를 조회하거나 결과를 가져올 수 있는 역할을 수행한다.

ExecutorService ex = Executors.newFixedThreadPool(3);

Callable<String> hello = () -> {
            Thread.sleep(5000L);
            return "Hello";
        };

Future<String> future = ex.submit(hello);
        System.out.println(future.isDone());
        System.out.println("Stated!");

        //future.get();
        future.cancel(false);

        System.out.println(future.isDone());
        System.out.println("End!");
  • Callable을 정의하여주고, 동일하게 submit()을 사용하여 실행해줄 수 있다.
  • 이 때 실행하는 것의 상태나 결과를 조회할 수 있게 future를 받을 수 있다.
  • 현재 작업이 완료되었는지는 future의 isDone()으로 알 수 있으며 만약 작업이 완료되었다면 true 아직 완료되지 않았다면 false를 리턴해준다.
  • 결과를 조회하는 방법은 future.get()을 사용해주면 되며 이 때 최종 결과가 나올 때 까지 블로킹이 된다.
  • 만약 쓰레드의 작업을 취소하고 싶으면 cancel()을 수행하면 되며 cancel()에 파라미터로 true가 오면 interrupt를 날리고 중지하고, false가 오면 모두 실행 후 중지를 해준다.
  • cancel을 하면 get()으로 가져올 수 없다.

여러개의 Callable 처리

동시에 여러개의 Callable을 처리할 수 있다.

ExecutorService ex = Executors.newFixedThreadPool(3);

        Callable<String> hello = () -> {
            Thread.sleep(5000L);
            return "Hello";
        };
        Callable<String> world = () -> {
            Thread.sleep(3000L);
            return "world";
        };
        Callable<String> nice = () -> {
            Thread.sleep(1000L);
            return "nice";
        };

        List<Future<String>> futures = ex.invokeAll(Arrays.asList(hello, world, nice));
        for(Future<String > future : futures){
            System.out.println("future = " + future.get());
        }
  • invokeAll()을 사용해주면 여러개의 Callable을 처리할 수 있다.
  • 동작 과정은 모든 Callable에 대한 작업을 처리하게 된다.
  • 그리고 나서 처리된 작업으로 결과를 보여주게 된다.
  • 즉 모든 작업을 처리하고 나서 뒤에 결과를 주는 것이 invokeAll()이다.
ExecutorService ex = Executors.newFixedThreadPool(3);

        Callable<String> hello = () -> {
            Thread.sleep(5000L);
            return "Hello";
        };
        Callable<String> world = () -> {
            Thread.sleep(3000L);
            return "world";
        };
        Callable<String> nice = () -> {
            Thread.sleep(1000L);
            return "nice";
        };

       String s = ex.invokeAny(Arrays.asList(hello, world, nice));
  • invokeAny()로 처리를 하게 되면 Callable중 하나라도 완료가 되면 그 결과 값을 반환받게 된다.
728x90
728x90
저작자표시 비영리

'Language > Java' 카테고리의 다른 글

Java8의 Annotation  (0) 2022.03.08
CompletableFuture로 비동기 프로그래밍 공부하기!  (0) 2022.03.04
자바 Excuter로 쓰레드 처리하기  (0) 2022.03.03
자바 쓰레드의 기초  (0) 2022.03.03
Java8의 시간 API 알아보기(LocalDateTime, Instant 등)  (0) 2022.03.01
    'Language/Java' 카테고리의 다른 글
    • Java8의 Annotation
    • CompletableFuture로 비동기 프로그래밍 공부하기!
    • 자바 Excuter로 쓰레드 처리하기
    • 자바 쓰레드의 기초
    JinSeopKim
    JinSeopKim
    기록📚

    티스토리툴바