카테고리 없음

[Effecttive Java] Item80. 스레드보다는 실행자, 태스크, 스트림을 애용하라

📝 작성 : 2022.09.18  ⏱ 수정 : 

java.util.concurrent

java.util.concurrent 패키지는 실행자 프레임워크라고 하는 인터페이스 기반의 유연한 태스크 실행 기능을 담고 있습니다.

ExcutorService exec  = Executors.newSingleThreadExcutor(); // 작업 큐 생성
exec.execute(runnable);
exec.shutdown();

실행자 서비스의 주요기능

  • 특정 태스크가 완료되기를 기다립니다.
  • 태스크 모음 중 아무것 하나(invokeAny 메서드) 혹은 모든 태스크(invokeAll 메서드)가 완료되기를 기다립니다.
  • 실행자 서비스가 종료하기를 기다립니다.(awaitTermination 메서드)
  • 완료된 태스크들의 결과를 차례로 받습니다.(ExecutorCompletionService 이용)
  • 태스크를 특정 시간에 혹은 주기적으로 실행하게 합니다.(ScheduledThreadPoolExecutor 이용)

스레드 풀

스레드 풀의 스레드 개수는 고정할 수도 있고 필요에 따라 늘어나거나 줄어들게 설정할 수 있습니다. 우리가 필요한 실행자 대부분은 java.util.concurrent.Executors의 정적 팩토리들을 이용해 생성할 수 있습니다.

평범하지 않은 실행자를 원한다면 ThreadPoolExecutor 클래스를 직접 사용합니다. 이 클래스로는 스레드 풀 동작을 결정하는 거의 모든 속성을 제어할 수 있습니다.

포크-조인

자바7 부터 실행자 프레임워크는 포크-조인(fork-join) 태스크를 지원하도록 확장되었습니다. 포크-조인 태스크는 포크-조인 풀이라는 특별한 실행자 서비스가 실행합니다. ForkJoinTask의 인스턴스는 작은 하위 태스크로 나뉠 수 있고, ForkJoinPool을 구성하는 스레드들이 이 태스크를 처리하며, 일을 먼저 끝낸 스레드는 다른 스레드의 남은 태스크를 가져와 대신 처리할 수도 있습니다.

반응형