그냥 알고만 가는 쓰레드의 기능 간략 정리
개념
프로세스란? 실행 중인 프로그램, 자원과 쓰레드로 구성
쓰레드란? 프로세스 내에서 실제 작업을 수행.
싱글과 멀티
싱글 쓰레드 프로세스 : 하나의 자원과 하나의 쓰레드
멀티 쓰레드 프로세스 : 하나의 자원과 다수의 쓰레드
멀티 프로세스와 멀티 쓰레드의 차이
멀티 프로세스 : 동시에 여러 프로세스 실행
멀티 쓰레드 : 하나의 프로세스 내에 동시에 여러 쓰레드 실행
- 프로세스 생성 비용 > 쓰레스 생성 비용
- 멀티 쓰레드는 서로 자원을 공유
멀티 쓰레드의 장단점
- 장점
- 시스템 자원을 효율적으로 사용
- 사용자에 대한 응답성 향상
- 코드 간결
- 단점
- 개발자 부담 (동기화, 교착상태, 각 쓰레드의 관리)
쓰레드의 구현과 실행
구현
- Thread 클래스 상속 : 메서드 run 오버라이딩
- Runnable 인터페이스 구현 : 추상메서드 run 구현
실행
- start()
쓰레드의 특징
- main쓰레드는 main메서드의 코드를 수행하는 쓰레드이다
- 사용자 쓰레드와 데몬쓰레드 두 종류가 있다
- 사용자 입력을 기다리는 구간동안 다른 쓰레드를 실행 (효율적으로 운영)
- 작업의 중요도에 따라 쓰레드의 우선순위를 다르게 할 수 있다 (높을 수록 작업 시간이 늘어남)
- 모든 쓰레드는 그룹으로 묶여져 있으며, 여러 그룹에 속할 수 있다 (보안을 위함, 기본은 main쓰레드 그룹)
데몬 쓰레드
- 일반 쓰레드의 작업을 돕는 보조적인 역할
- 일반 쓰레드가 모두 종료시 자동적으로 종료된다.
쓰레드의 상태
상태 | 의미 |
NEW | 쓰레드가 생성되고 호출되지 않은 상태 |
RUNNABLE | 실행 중 or 실행 가능 상태 |
BLOCKED | 동기화 블럭에 의해 일시정지된 상태 (풀릴 때까지 대기) |
WAITING, TIMED_WAITING | 실행도중 일시정지된 상태, TIMED_WAITING은 일시정지 시간이 지정된 경우 |
TERMINATED | 쓰레드의 작업이 종료된 상태 |
쓰레드의 실행제어
메소드 | 기능 |
sleep | 지정된 시간 동안 쓰레드를 일시정시킨다. |
join | 지정된 시간동안 쓰레드가 실행되도록 한다. 끝나면 호출한 쓰레드로 복귀 |
interrupt | 위에서 지시한 일시정지상태인 쓰레드를 깨워서 실행대기상태로 만든다. |
yield | 실행 중에 자신에게 주어진 실행시간응ㄹ 다른 쓰레드에게 양보하고 자신은 실행대기상태가 된다. |
stop (deprecated) | 쓰레드를 즉시 종료 |
suspend (deprecated) | 쓰레드를 일시정지킨다. |
resume (deprecated) | suspend에 의해 일시정지상태에 있는 쓰레드를 실행대기상태로 복귀 |
*deprecated된 메서드는 쓰레드를 교착 상태로 만들기 쉽다는 이유로 쓰이지 않게 되었다
쓰레드의 동기화
배경 : 멀티 쓰레드 포르세스에서는 다른 쓰레드의 작업에 영향을 끼침, 간섭을 피하기 위해 동기화가 필요
개념 : 한 쓰레드가 진행 중인 다른 쓰레드가 간섭하지 못하게 막는 것
절차
- 동기화하려는 코드를 임계 영역으로 설정 (lock이 걸리는 영역)
- 임계영역은 락을 얻은 단 하나의 쓰레드만 출입 가능
sysnchronized를 이용한 동기화
- 메서드 전체 또는 특정한 영역을 설정할 수 있다
wait()과 notify()
- 동기화 효율 증진
- sysnchronized 블록 내에서만 사용 가능
- wait() : 객체의 lock을 풀고, 쓰레드를 해당 객체의 waiting pool에 넣는다
- notify() : waiting pool에서 대기중인 쓰레드 중의 하나를 깨운다
- notifyAll() : waiting pool에서 대기중인 모든 쓰레드를 깨운다
'JAVA' 카테고리의 다른 글
[JAVA] [끄적임] 입출력 스트림과 버퍼 스트림 (0) | 2022.08.29 |
---|---|
[JAVA] [끄적임] 인터페이스 간단 정리 (0) | 2022.08.24 |
[JAVA] [끄적임] 메소드 오버라이딩 (+링크드 리스트) (0) | 2022.08.24 |
[JAVA] [끄적임] Swing 컴포넌트 간단하게 정리 (0) | 2022.08.24 |
[JAVA] [끄적임] private 접근제한자를 사용하는 이유 (0) | 2022.08.24 |