[JAVA8] Callable과 Future

이재훈·2023년 5월 13일
0

JAVA8

목록 보기
13/23

인프런 강의 "더 자바, JAVA8"(백기선님)의 강의를 듣고 정리한 글 입니다.
JAVA8에 추가된 핵심 기능들을 이해하기 쉽게 설명해 주시니 한번씩 들어보시는 것을 추천드립니다.

"더 자바, JAVA8 바로가기"


callable

  • Runnable과 유사하지만 작업의 결과를 받을 수 있다.

Future

  • 비동기적인 작업의 현재 상태를 조회하거나 결과를 가져올 수 있다.
  • 아래 코드는 started! 는 바로 출력되지만 End!는 잠시 후에 값이 출력된다.
public class App {
	public static void main(String[] args) throws Exception{
		ExecutorService service = Executors.newSingleThreadExecutor();
		
		Callable<String> hello = () -> {
			Thread.sleep(2000L);
			return "Hello";
		};
		
		Future<String> result = service.submit(hello);
		System.out.println("Started!");
		
		result.get(); // 블로킹
		System.out.println("End!");
		
		service.shutdown();
	}
}

결과를 가져오기

  • 블록킹 콜이다.
  • 타임아웃(최대한으로 기다릴 시간)을 설정할 수 있다.
Future<String> result = service.submit(hello);
result.get(); // 블로킹

작업 상태 확인하기 isDone()

  • 완료 했으면 true 아니면 false를 리턴한다.
Future<String> result = service.submit(hello);
System.out.println(result.isDone()); // false
result.get(); // 블로킹
System.out.println(result.isDone()); // true		

작업 취소하기 cancel()

  • 최소 했으면 true 못했으면 false를 리턴한다.
  • parameter로 true를 전달하면 현재 진행중인 쓰레드를 interrupt하고 그러지 않으면 현재 진행중인 작업이 끝날 때까지 기다린다.
result.cancel(false);

여러 작업 동시에 실행하기 invokeAll()

  • 동시에 실행한 작업 중에 제일 오래 걸리는 작업 만큼 시간이 걸린다.
public class App {
	public static void main(String[] args) throws Exception{
		ExecutorService service = Executors.newSingleThreadExecutor();
		
		Callable<String> hello = () -> {
			Thread.sleep(1000L);
			return "Hello";
		};
		Callable<String> java = () -> {
			Thread.sleep(2000L);
			return "java";
		};
		Callable<String> foo = () -> {
			Thread.sleep(3000L);
			return "foo";
		};
		
		List<Future<String>> futures = service.invokeAll(Arrays.asList(hello, java, foo));
		
		futures.stream().forEach(f -> {
			try {
				System.out.println(f.get());
			} catch (InterruptedException | ExecutionException e) {
				e.printStackTrace();
			}
		});
		
		service.shutdown();
	}
}

여러 작업 중에 하나라도 먼저 응답이 오면 끝내기 invokeAny()

  • 동시에 실행한 작업 중에 제일 짧게 걸리는 작업 만큼 시간이 걸린다.
  • 블록킹 콜이다.
public class App {
	public static void main(String[] args) throws Exception{
		ExecutorService service = Executors.newFixedThreadPool(4); // 쓰레드를 4개 생성
		
		Callable<String> hello = () -> {
			Thread.sleep(1000L);
			return "Hello";
		};
		Callable<String> java = () -> {
			Thread.sleep(2000L);
			return "java";
		};
		Callable<String> foo = () -> {
			Thread.sleep(3000L);
			return "foo";
		};
		
		String result = service.invokeAny(Arrays.asList(hello, java, foo));
		
		System.out.println(result); // 제일 짧은 hello를 출력
		
		service.shutdown();
	}
}
profile
부족함을 인정하고 노력하자

0개의 댓글