Thread
- 프로그램내에서 실행되는 실행 단위
- 🎯 쓰레드를 여러개 만들어 비동기적 처리가 가능하게 한다.
🎯 Thread의 문제점
- 스레드 중 한 스레드만 문제가 있어도, 전체 프로세스가 영향을 받음
- 스레드를 많이 생성하면, Context Switching이 많이 일어나, 성능 저하
- 동시에 접근을 하게 되면, 연산이 늦게 끝난 스레드의 결과값으로 덮어씌워짐 (데이터 불일치)
🎯 해결방법
- 1번과 2번은 Coroutine을 통해 해결할 수 있다.
- Coroutine은 Thread를 더 잘게 나누어 동시성을 가지게 되므로
- 하나의 코루틴에서 오류가 발생하더라도 해당 코루틴 작업만 처리가 되며 다른 스레드에는 영향을 끼치지 않는다.
- 3번은 동기화(Synchronization)을 활용한다.
- Mutex / Semaphore 등 활용
🎯 Thread 종료
- Thread.destory()
- Thread를 파괴하기 위한 함수
- 이 함수는 리소스를 정리하지 못해 데드락이 발생할 수 있음
- 따라서, 이는 구현이 되어 있지 않음
- Thread.stop()
- Java의 모든 객체들은 Monitor를 가지고 있으며 하나의 객체를 여러 스레드에서 접근할 수 없도록 잠금 기능을 사용하여 중복 접근을 막는 역할을 수행
- 그런데 Thread.stop 함수를 사용해서 쓰레드가 멈추면 이 Monitor 잠금 기능이 풀림
- 여러 쓰레드에서 접근이 가능, 일관성이 깨짐
- Thread.interrupt()
- InterruptedException을 발생시켜 중지 시킴
- interrupt 플래그 값이 true로 설정
- 스레드가 일시 정지상태가 되었을 때 중지됨
- 정상종료
- running중인 작업을 정상적으로 종료시키는 것이 가장 안정적이다.
- while(flag)를 세워 특정 상황에서 flag를 false로 비활성화 시켜 정상적으로 종료시키는 것이 안전함