[Java] Concurrent Package

NNIJGNUS·2024년 7월 4일

Java

목록 보기
2/4

저번 포스트에서 스레드 객체를 생성하고 스레드 메소드를 통해 관리하는 방법을 학습하였다.

하지만 수많은 스레드를 생성하고 관리하는 것은 불가능에 가깝고,
심지어 이러한 스레드들의 실행 순서 또한 보장되지 않으므로 필연적으로 동시성 문제를 야기한다.

이를 위해 자바에서는 친절하게도 고수준의 Concurrent 프로그래밍을 지원한다.

java.util.concurrent

java.util.concurrent는 java 5에서 추가된 패키지로, Concurrent programming에 필요한 유틸리티 클래스들을 지원한다.

Executor

자바에서는 Executor 프레임워크를 사용하여 스레드 풀을 관리할 수 있으며,
이를 통해 스레드 생성, 실행, 종료 등의 작업을 효율적으로 관리할 수 있다.

ExecutorService

Executor를 상속받아 Future를 생성하는 메서드와 종료를 관리하는 메서드를 제공하는 인터페이스

주요 메소드

Executor.newFixedThreadPool(int nThread) // nThread의 스레드 풀을 가지는 Executor 생성
Executor.execute(Runnable runnable) // 스레드 작업 수행
Executor.submint(Runnable runnable) // 스레드 작업 수행 후 Future를 생성하고 반환
Executor.shutdown() // 현재 작업을 마치면 종료
Executor.shutdownNow() // 즉시 종료

사용 예제


스레드 간의 실행 순서가 보장되지 않음도 확인할 수 있다.

Callable

지금까지 스레드를 생성할 때는 Runnable 객체를 사용했다.
하지만 Runnable 객체는 반환값이 void, 즉 스레드의 처리 결과를 반환받을 수 없지만
Callable은 객체 타입을 반환하므로 처리 결과를 반환받을 수 있다.

Future

비동기 계산의 아직 계산되지 않은 결과를 표현할 수 있는 인터페이스.

주요 메소드

get() // 연산의 결과를 반환, 연산이 완료되지 않았다면 완료될 때까지 기다린 후 반환 
get(long timeout, TimeUnit unit) // 지정한 시간동안 결과를 기다린 후 타임아웃 시 TimeoutException 반환
isDone() // 연산이 완료되었는지 여부를 반환
cancel(boolean mayInturrputIfRunning) // 연산을 취소, 매개변수는 작업이 진행 중일 때 중단 가능한지 여부
isCancelled() // 저작업이 취소되었는지 여부 반환

사용 예제

Future 생성 및 사용

ExecutorService와 Future를 이용해 비동기 작업 실행

Future의 장단점

장점

  • 비동기 작업의 결과를 쉽게 관리 가능
  • 작업 완료를 기다릴 필요 없이 결과가 필요할 때 출력 가능
  • isDone() 메소드를 통해 작업 완료 확인 가능

단점

  • Future는 작업이 완료되었는지 알려주는 메소드를 제공하지만 polling 방식으로 작동.
  • 연산 결과를 가져올 때 블로킹: get() 메소드를 호출하면 결과가 준비될 때까지 현재 스레드가 블로킹

추가

Java8에서는 Future의 단점을 극복하기 위해 CompleteFuture를 도입해 기능을 향상시키고자 함

0개의 댓글