-
[매일읽기] Understanding Java threads once and for all개발자 라이프/매일읽기 2020. 8. 4. 21:45반응형
원문 : https://medium.com/swlh/understanding-java-threads-once-and-for-all-711f71e0ec1e
스레드(Thread)
- 큰 데이터를 서브 셋으로 쪼개 병렬로 처리할 때 스레드로 처리할 수 있음
- CPU 프로세서 코어 수 등 하드웨어 스펙에 따라 스레드 성능이 영향을 받을 수 있음
- 만약 스레드 수가 코어 수보다 많다면, 각 프로세스는 실제로 병렬 형태로 처리되는 것이 아니기 때문에 공유되는 객체(SO, Shared Object)는 가용 코어에서의 각 프로세스가 소모하는 시간을 관리해야 함
테스크(Task, 작업) 만들기
본문에서 스레드 인스턴스를 테스크로 정의했습니다.
- Thread 클래스를 이용하여 테스크를 생성할 수 있음
- 아무 파라미터가 없는 Thread 생성자로 만든 테스크는 어떠한 비즈니스 로직을 담고 있지 않음
- Runnable 아규먼트와 함께 테스크를 생성할 수 있음
- Runnable 인터페이스를 구현한 클래스는 테스크에 대한 비즈니스 로직을 담고 있음
- run() 메소드 내부에 로직이 구현됨
테스크 실행
- Thread 클래스의 start() 메소드로 테스크 실행
- 여러 테스크를 실행했을 때, 실제 처리 순서는 그 실행 순서와 다를 수 있음
모니터링
- 스레드 모니터링은 JConsole을 이용하여 할 수 있음
- JConsole은 Jdk 디렉터리 중 bin 디렉터리 내부에 위치함
스레드들이 서로에게 영향을 준다면?
- 여러 테스크들이 공통의 Runnable 구현 클래스를 아규먼트로 생성했다면 테스크들 간 동작은 서로에게 영향을 줄 수 있다.
- ex. Counter (본문 참조)
- 이 때 Runnable 구현 클래스는 run() 메서드 내부에서 synchronize 키워드로 동시 접근을 막을 수 있음
- 접근 제어된 리소스에 접근하기 위해 mutex를 사용
스레드 간 순서가 보장되어야 한다면?
- synchronize 키워드는 원자적 실행만 보장하기 때문에 스레드 간 실행 순서를 보장하지 않음
- 스레드의 실행 순서를 구성하기 위해 wait() 메소드를 사용
- wait() 메소드는 모든 자바 객체에 구현되어 있음
- wait() 메소드는 동기화된(synchronized) 자원을 잠금 해제할 수 있는 키를 반환
- 그래서 자원을 필요로하지 않는 다른 스레드는 해당 리소스를 기다릴 필요 없음
- 자원이 점유 해제되면 대기 스레드들에게 알려(notify) 데드락 없이 지속적인 실행이 가능하도록 함
스레드의 처리를 종료해야 한다면?
- 공통의 작업을 위해 여러 독립적인 스레드가 구성된다면 그 스레드들을 오케스트레이션 해야 함
- 이때, 스레드들은 공통으로 가지는 일시적인 속성을 모니터링하면서 처리 진행 여부를 판단할 수 있음
- 해당 속성은 임계 영역에 포함되지 않는 비동기 속성
읽고 나서
- 오래간만에 스레드를 복습해서 좋았음
- notify 메소드를 이용해서 순서를 구성하는 것은 조금 더 자세히 살펴볼 필요가 있을 듯
반응형