JAVA 36. main Thread and Thread Synchronization
Chapter | 12 | ~ | 13 | |
---|---|---|---|---|
Ch 12 | 35 | 36 | ||
Ch 13 | 37 |
main Thread and Thread Synchronization
main Thread
-
JVM이 프로그램을 실행할 때 디폴트로 생성되는 스레드
-
main() 메소드에서 현재 스레드 정보를 가진 Thread 객체를 알아내어 현재 실행중인 스레드에 관한 다양한 정보 출력
public class ThreadMainEx { public static void main(String[] args) { long id = Thread.currentThread().getId(); String name = Thread.currentThread().getName(); int priority = Thread.currentThread().getPriority(); Thread.State s = Thread.currentThread().getState(); System.out.println(id); System.out.println(name); System.out.println(priority); System.out.println(s); } }
Thread Exit
- 스스로 종료 : run() 메소드에서 리턴 (이 코드에서 보듯이, catch문 안의 return)
- 타 스레드에서 종료 : interrupt() 메소드 사용 (th.interrupt())
연습문제 1 : 이 코드를 읽고 이 코드가 하는 일과 각 코드를 줄 별로 설명하시오.
연습문제 1 : 예시답안
Thread Synchronization
- 멀티스레드 프로그램의 작성시 주의점
- 다수의 스레드가 공유 데이터에 동시 접근하는 경우, 예상치 못한 결과 발생 가능
- 스레드 동기화
- 스레드 사이의 실행 순서 제어, 공유 데이터에 대한 접근을 원활화
- 공유 데이터의 동시 접근 문제 해결
- 공유 데이터에 접근하는 모든 스레드를 한 줄로 세우기
- 한 스레드가 공유 데이터에 대한 작업을 끝낼 때까지 다른 스레드가 대기
synchronized Block
- synchronized 키워드
- 스레드가 독점적으로 실행해야하는 부분을 표시하는 키워드
- synchronized 블록 지정 : 메소드 전체 혹은 코드 블록
synchronized void print(String text) { ... } // synchronized method
void execute(String text) {
...
synchronized(this) { // synchronized code block
...
}
...
}
- synchronized 블록이 실행되는 경우
- 모니터 : 해당 객체를 독점적으로 사용하는 권한 (monitoring)
- 먼저 실행한 스레드가 모니터를 소유
- 모니터를 소유한 스레드가 모니터를 내놓을 떄까지 다른 스레드가 대기
연습문제 2 : 이 코드에서 synchronized를 추가하여 정상적으로 출력이 되도록 바꾸시오.
wait()-notify() Synchronization
- wait()-notify()가 필요한 경우
- 공유 데이터로 두 개 이상의 스레드가 데이터를 주고 받는 경우
- 동기화 메소드
- wait() : 다른 스레드가 notify()를 불러 줄 때까지 기다림
- notify() : wait()를 호출하여 대기중인 스레드를 깨움
연습문제 3 : 이 코드에서 동기화가 되는 부분이 어느 부분인지 설명하고, 발생 가능한 오류를 모두 찾아 수정하시오.
정답 없음
Thanks for watching my post!
Comments