프로세스 : 실행중인 프로그램 --> 멀티태스킹 : 다중 프로세스 실행
쓰레드 : 프로세스 내에서 실제로 작업을 수행하는 곳 --> 멀티쓰레딩 : 한 프로세스 내에서 다중 쓰레드 실행
● 쓰레드 구현
- 쓰레드를 통해 작업하고자 하는 내용을 run()에 구현하는 것.
1. Thread 클래스를 상속 : 이방법을 쓰면 자바의 단일상속에 의해 다른 클래스를 상속받을수 없음.
2. Runnable 인터페이스 구현 : 쓰레드간의 데이터를 공유해야 할 때 인터페이스로 구현해서 연결시킴
● Runnable 인터페이스
- 추상메서드 run()만 정의되어있음
● start()
- 쓰레드를 실행시킬 때 사용하는 인스턴스 메서드(Thread 클래스에 구현되어 있음)
- 하나에 쓰레드에 대해 한번만 호출 가능(다시 호출하기 위해서는 new 연산자로 다시 만들어 줘야함)
- 새로운 쓰레드를 호출스택에 생성한 다음 run()을 호출
- 실행 대기 상태로 전환시키며 실행 중인 쓰레드가 없으면 바로 실행시킴
● run()
- 쓰레드를 실행시키는 것이 아닌 run()에 구현된 메서드를 호출하는 것.
- 쓰레드를 실행시키는 start()에 의해 호출당함.
● Thread.currentThread()
- 현재 쓰레드 표기 ex) Thread[name, priority, group]
● 데몬 쓰레드 : 일반 쓰레드를 돕기위한 보조역할 쓰레드
- setDaemon(true)로 설정함. 이 메서드는 꼭 start() 호출 전에 실행 되어야함.
- 보조적인 역할만 하기 때문에 일반 쓰레드가 종료되면 자동으로 종료됨.
● 스케줄링(실행제어)
생성 --①-->실행대기<----②---->실행 --⑤-->소멸
└<-④-일시정지<-③ ┘
① - start() : 실행대기 or 바로 실행
② - yield() : 다시 실행대기상태가 되고 다음 쓰레드가 실행됨
③ - suspend(), sleep(), wait(), join(), I/O block : 일시정지 상태로 전환 ex) 사용자의 입력을 기다림.
④ - resume(), notify(), interrupt(), timeout : 일시정지에서 벗어나 다시 실행대기로 전환
⑤ - stop() : 쓰레드 소멸
● 동기화(Synchronization)
- 한 쓰레드가 진행 중인 작업을 다른 쓰레드가 간섭하지 못하도록 함.
- lock을 갖은 하나의 쓰레드만 임계 영역 내의 코드 수행
- synchronized로 임계 영역 설정.
1. 동기화 메서드 : 메서드 선언부에 synchronized 설정
synchronized void withdraw() {
if (money <= 0) {
return;
}
money -= 10000;
System.out.println(Thread.currentThread().getName() + "출금. 잔액 : " + money);
}
2. 동기화 블록 : synchronized 블록 지정
public void withdraw() {
synchronized(this) {
if (money <= 0) {
return;
}
money -= 10000;
System.out.println(Thread.currentThread().getName() + "출금. 잔액 : " + money);
}
- wait() : 사용 중인 lock을 강제로 반납시킴.
- notify() : 중단 됐던 쓰레드가 lock을 다시 얻어 실행됨(재진입)
'Langauge > JAVA' 카테고리의 다른 글
어노테이션(Annotation) (0) | 2020.06.01 |
---|---|
열거형(Enum) (0) | 2020.06.01 |
지네릭(Generics) (0) | 2020.05.31 |
예외처리(try-catch-finally) (0) | 2020.05.22 |
내부 클래스 (0) | 2020.05.21 |