학습할 것 (필수)
- Thread 클래스와 Runnable 인터페이스
- 쓰레드의 상태
- 쓰레드의 우선순위
- Main 쓰레드
- 동기화
- 데드락
Thread 클래스와 Runnable 인터페이스
프로세스와 쓰레드
프로세스
- 프로그램을 실행하면 OS로 부터 실행에 필요한 메모리를 할당받아 프로세스가 된다.
- 이 프로그램을 실행하는데 필요한 데이터와 메모리등의 자원 그리고 쓰레드로 구성되어 있다.
- 모든 프로세스에는 한개이상의 쓰레드가 존재한다.
- 둘 이상의 쓰레드를 가진 프로세스를 멀티쓰레드 프로세스라고 칭함.
쓰레드
- 프로세스 내에서 작업을 수행하는 역할
쓰레드를 구현하는 방법 중 두가지
Thread 클래스를 상속
class TestThread1 extends Thread { public void run() { //내용 } } thread 클래스를 상속받아 run을 오버라이딩하여 구현함.
Runnable 인터페이스를 구현
class TestThread2 implements Runnable { public void run() { //내용 } } Runnable 인터페이스의 run을 구현함.
두가지 방식의 차이점
-
인스턴스의 생성법이 다르다.
TestThread1 thread = new TestThread1(); // Thread 클래스를 상속받았을 경우 Runnable r = new TestThread2(); Thread t = new Thread(r); // Runnable 인터페이스를 구현한 경우 -
호출이 다르다.
- Thread클래스를 상속받으면 서브클래스에서 슈퍼클래스의 메소드를 직접 호출가능
- Runnable을 구현할 경우 static 메소드인 currentThread()를 호출하여 쓰레드의 참조를 가져와야 호출이 가능함.
쓰레드의 상태
- NEW
- 아직 thread가 생성은 됬지만 실행되지 않은 상태.
- RUNNABLE
- jvm이 thread를 실행중인 상태
- 실행중이므로 CPU에서 자원을 할당받은 상태이고
- 운영체제의 자원 분배로 인해 WAITING 상태가 될수 있다.
- BLOCKED
- Monitor를 획득하기 위해 다른 스레드가 락을 해제하기를 기다리는 상태
- Java thread 동기화 모델은 모니터란 개념을 적용 중이다.
- 모니터는 하나의 데이터 ( 객체 ) 마다 하나의 모니터를 결합 할수 있으며
- 그것이 결합된 데이터 가 동시에 두개 이상의 스레드에 의해 접근할수 없도록 막는 락을 제공함
- 결국 BLOCKED 상태는 다른사용자가 사용하고 있는 데이터를 사용하기위해 기다리고 있는 상태
- WAITING
- 다른 스레드가 특정 작업을 수행할떄까지 무기한으로 대기중인 상태
- wait() , join() , park() 메소드 등을 이용해 대기중임.
- TIMED_WATING
- 다른 스레드가 지정된 대기 시간까지 작업을 수행하기를 기다리는 상태
- sleep() , wait(), join(), park() 메소드등을 사용해 대기중인 상태
- WAITING 상태와의 차이점은 메서드의 인수로 최대 대기 시간을 명시할 수 있어 외부적인 변화뿐만 아니라 시간에 의해서도 WAITING 상태가 해제될 수 있다는 것
- 출처 d2.naver
- TERMINATED
- 스레드가 종료된 상태
쓰레드의 우선순위
- 쓰레드는 우선순위라는 속성 ( 멤버변수) 를 가지고 있는데 이 값에 따라 쓰레드가 얻는 실행시간이 달라진다.
- 쓰레드가 수행하는 작업의 중요도에 따라 우선순위를 서로 다르게 지정하여 특정 쓰레드가 더 많은 작업시간을 갖게 할수 있다.
- setPriority 메소드로 우선순위를 지정할수 있음.
- getPriority로 우선순위를 반환함.
메인 쓰레드
- main 메소드에서 작업을 수행하는 것
- main 메소드를 실행시 jvm에서 돌아가게 되며 이때 jvm은 프로세스가 되어 운영체제로 부터 자원을 할당받고 쓰레드가 실행되는데 이떄 main 메소드에서 실행하는게 main 쓰레드다.
데몬 쓰레드
- 다른 일반 쓰레드의 작업을 돕는 보조적인 역할의 쓰레드
- 일반 쓰레드가 모두 죵로되면 같이 종료된다.
- setDaemon 메소드로 유저 쓰레드가 될지 데몬 쓰레드가 될지 정할수 있다.
동기화
- 멀티쓰레드를 사용하는 경우 하나의 데이터를 사용하려고 할때 다른 쓰레드가 접근하지 못하게 막는 것.
public synchronized void test() { } // 메소드 전체를 임계 영역으로 지정 public void test() { synchronized() { } } // 특정 지역을 임계 영역으로 지정
주의점
- 임계영역은 작을수록 좋음.
- 임계영역이 클수록 어떤 오류가 발생할지 모르기 때문.
- 임계영역은 최소한으로 줄여야함
- 임계영역이 여러곳일 경우 A 쓰레드에서는 통과가 안될 로직이 B 쓰레드가 작동함으로써 통과되는 버그가 일어날수도 있기 떄문.
데드락
-
두개 이상의 스레드에서 작업을 완료하기 위해 상대의 작업이 끝나기를 기다리는 상황
-
쓰레드 A가 작업을 계속 하려면 쓰레드 B의 작업이 끝나기를 기다려야 하고
-
쓰레드 B가 작업을 계속 하라면 쓰레드 A의 작업이 끝나기를 기다려야 하는 상황.
-
어느 한쪽이 자신의 락을 해제하기 전까지는 데드락 상태는 해제되지 않는다.
참조
'백선생님 온라인스터디' 카테고리의 다른 글
13주차 I/O (0) | 2021.03.01 |
---|---|
12주차 애노테이션 (0) | 2021.02.28 |
11주차 Enum (0) | 2021.01.30 |
9주차 - 예외 처리 (0) | 2021.01.19 |
8주차 - 인터페이스 (0) | 2021.01.16 |