자바 동시성 - 4. 작업 실행

roon-replica·2022년 8월 25일
0

java

목록 보기
6/6

개요

  • 애플리케이션이 해야 할 일을 작업(task)라는 단위로 분할하면 프로그램의 구조를 간결하게 잡을 수 있다고 함. 다음과 같은 장점이 있다고 함.
    • 프로그램의 구조를 간결하게?
    • 트랜잭션의 범위를 지정하여 오류에 효과적으로 대응 가능
    • 작업 실행 부분의 병렬성 극대화

스레드에서 작업 실행

  • 작업의 범위, 작업 실행 정책을 잘? 설정해야 함..

작업을 실행하는 방법

  1. 기장 기본적인 방법
    작업을 단일 스레드에서 순차적으로 실행하기.
    서버-클라이언트 구조에서 요청 처리 과정은 I/O 작업이 큰 부분을 차지.
    만약 서버 애플리케이션이 단일 스레드에서 동작하면, I/O 작업때문에 다른 요청을 전혀 처리하지 못하게 됨.

  2. 작업마다 스레드를 생성하는 방법
    요청이 들어올 때 마다 새로운 스레드를 하나씩 만들어 실행시키면 응답 속도를 더 높일 수 있음.
    이렇게하면 요청을 병렬로, 동시에 처리 가능.
    동시에 스레드 안전성을 확보해야 함.

스레드를 많이 생성할 때의 문제점

  • 작업마다 스레드를 매번 생성하는 정책은 상용 서비스에서 사용하기에는 무리가 있다고 함.
  1. 스레드 라이프 사이클 문제
    스레드 생성, 제거 작업에도 자원이 소모된다고 함.. -> delay

  2. idle 상태에 있는 스레드가 많아질수록 많은 메모리를 필요로 함.
    JVM GC 부하가 늘어나고, CPU를 사용하기 위해 여러 스레드가 경쟁하는 상황이 되어서 많은 컨텍스트 스위칭 비용도 발생하게 됨.

  3. OutOfMemoryError 발생 가능성
    자원이 고갈되어 프로그램이 멈추는 경우가 발생하지 않는지 꼭 테스트해야 한다고 함!!
    요청마다 스레드를 만들면, 요청 엄청 많아져서 자원 고갈시켜 OutOfMemoryError 발생 가능하다는 거임

Executor 프레임워크?

  • 작업(task)는 논리적인 업무? 단위, 스레드는 특정 작업을 비동기로 동작시킬 수 있는 방법.

  • java.util.concurrent 패키지의 Executor 인터페이스에 스레드풀들이 제공됨.

실행 정책

thread pool

  • 스레드풀은 풀 내의 스레드로 처리할 작업을 쌓아둬야 해서 작업 큐와 밀접한 관련이 있다고 함.
  • 풀 내부의 스레드를 사용해 작업을 실행하는 방식은, 매번 스레드를 새로 만드는 것보다 많은 장점이 있다고 함!
    • 자원 절약
    • 스레드가 이미 만들어져 대기하고 있어 딜레이 감소
    • 스레드 풀의 크기를 적절히 설정하면 프로세서 활용도 증가하면서도
      스레드를 매번 생성할 때와 달리, 스레드 간에 한정된 자원을 두고 경쟁하는 것도 완화될 것.

Executor 동작 주기?

  • Executor를 제대로 종료시키지 않으면 JVM 종료가 안되기도 한다고 함..
    종료 방식은 graceful / abrupt등 여러가지가 있다고 함.

  • ExecutorService의 상태는 running, shutting down, terminated 3가지 상태가 있다고 함

  • 실행 거절 핸들러(rejected execution handler)
    이미 종료 절차가 시작되거나 종료된 이후에 새로운 작업을 등록하려 하면 실행 거절 핸들러를 통해 오류로 처리한다고 함.

지연 작업, 주기적 작업

병렬로 처리할만한 작업

  • I/O bound task
    ex) 이미지 다운로드, DB 쿼리 등 네트워크 타는거..

  • Callable, Future 사용 가능하다고 함..

질문들

  • thread life cycle?

  • single thread executor는 작업을 처리하는 스레드가 1개뿐이라는데..
    안좋은거 아님? 이게 효율적임?

  • newCachedThreadPool은 왜 이름에 캐시가 들어가있는거?

  • Timer 클래스 vs ScheduleThreadPoolExecutor 클래스

  • Callable 인터페이스..?

profile
집중 ➝ 프로세서↑ 시간 투자 ➝ 디스크↑

0개의 댓글