반응형
Thread 란?
- process 실행 중인 프로그램이 실행되면 OS로부터 메모리를 할당받아 프로세스 상태가 됨
- thread : process는 하나 이상의 thread를 가지게 되고, 실제 작업을 수행하는 단위는 thread
- ' 하나의 프로그램이 돌아간다 = 하나 이상의 thread를 갖고 있다 '
multi-threading
- 여러 thread가 동시에 수행되는 프로그래밍, 여러 작업이 동시에 실행되는 효과
- thread는 각각 자신만의 작업 공간을 가짐( context )
- 각 thread 사이에서 공유하는 리소스가 있을 수 있음(자바에서는 static instance)
- 여러 thread가 리소스를 공유하여 작업이 수행되는 경우 서로 자원을 차지하려는 race condition이 발생할 수 있음
- 이렇게 여러 thread가 공유하는 자원 중 경쟁이 발생하는 부분을 critical section 이라 함.
- critical section에 대한 동기화(일종의 순차적 수행)를 구현하지 않으면 오류가 발생
리소스(resource) = 자원
Thread 만들기
① Thread 클래스 상속
class MyThread extends Thread{
public void run() {
int i;
for(i = 0; i<200; i++) {
System.out.print(i + "\t");
}
}
}
public class ThreadTest {
public static void main(String[] args) {
System.out.println(Thread.currentThread());
MyThread th1 = new MyThread();
th1.start();
MyThread th2 = new MyThread();
th2.start();
}
}
② Runnable 인터페이스 구현
class MyThread2 implements Runnable{
public void run(){
int i;
for(i=0; i<200; i++){
System.out.print(i + "\t");
}
}
}
public class ThreadTest2 {
public static void main(String[] args) {
System.out.println("main start");
MyThread2 mth = new MyThread2();
Thread th1 = new Thread(mth);
th1.start();
Thread th2 = new Thread(new MyThread2());
th2.start();
System.out.println("main end");
}
}
Thread Status
Thread 클래스의 메서드
Thread 우선순위
- Thread.MIN_PRIORITY(=1) ~ Thread.MAX_PRIORITY(=10)
- 디폴트 우선순위 : Thread.NORMAL_PRIORITY(=5)
- 우선순위가 높은 Thread가 CPU의 배분을 받을 확률이 높음
- setPriority( ) / getPriority( )
join( )
- 동시에 두 가 이상의 Thread가 실행될 때 다른 Thread의 결과를 참조하여 실행해야 하는 경우 join( ) 함수를 사용
- join( ) 함수를 호출한 Thread가 not-runnable 상태가 됨
- 다른 Thread의 수행이 끝나면 runnable 상태로 돌아옴
interrupt( )
- 다른 Thread에 예외를 발생시키는 interrupt를 보냄.
- Thread가 join( ), sleep( ), wait( ) 함수에 의해 not-runnable 상태일 때 interrupt( ) 메서드를 호출하면 다시 runnable 상태가 될 수 있음
Thread 종료
- Thread를 종료할 때 사용
- 무한 반복의 경우 while(flag)의 flag 변숫값을 false로 바꾸어 종료
멀티 Thread 프로그래밍에서의 동기화
critical section과 semaphore
- critical section은 두 개 이상의 thread가 동시에 접근하는 경우 문제가 생길 수 있기 때문에 동시에 접근할 수 없는 영역
- semaphore는 특별한 형태의 시스템 객체이며 get/release 두 개의 기능이 있음
- 한 순간 오직 하나의 thread 만이 semaphore를 얻을 수 있고, 나머지 thread들은 대기(blocking) 상태
- semaphore를 얻은 thread 만이 critical section에 들어갈 수 있음.
노란색 영역 : shared 리소스를 사용하는 임계 영역 , 메서드 구간
순차적으로 진행 → 동기화
동기화 (synchronization)
- 두 개의 thread가 같은 객체에 접근할 경우, 동시에 접근함으로써 오류가 발생
- 동기화는 임계 영역에 접근한 경우 공유 자원을 Lock 하여 다른 thread의 접근을 제어
- 동기화를 잘못 구현하면 deadLock에 빠질 수 있음
synchronized 블록
현재 객체 또는 다른 객체를 Lock으로 만듦
synchronized (참조형 수식) {
수행문;
}
synchronized 메서드
- 객체의 메소드에 synchronized 키워드 사용
- 현재 이 메서드가 속해 있는 객체에 Lock 적용
- 자바에서는 deadlock을 방지하는 기술이 제공되지 않으므로 되도록 synchronized 메서드에서 다른 synchronized 메서드는 호출하지 않도록 함
deadlock 이란
wait( ) / notify( ) 동기화 프로그래밍
① wait( )
리소스가 어떤 조건에서 더 이상 유효하지 않은 경우 리소스를 기다리게 하는 것
② notify( )
유효한 리소스가 생기면 notify( )가 호출되고 wait( )이 적용된 Thread는 재시작하게 됨
③ notityAll( )
wait( ) 상태 Thread들 모두 재시작
이 경우 유효한 리소스 만큼의 Thread만이 수행되고 리소스를 갖지 못한 thread는 다시 wait( ) 상태가 된다.
- wait( ) 상태 Thread들은 notify( )가 호출 될 때까지 기다림
- wait( ) 상태 Thread가 많으면 notify( )가 호출 됐을 때, 무작위로 재시작을 함
- 자바에서는 대체적으로 notifyAll( ) 메서드 사용을 권장
반응형
'개발 > Java' 카테고리의 다른 글
[JAVA 파헤치기] 문자 타입 'char' 와 문자열 'String' 의 진실 (18) | 2022.05.06 |
---|---|
[JAVA 파헤치기] 객체 지향, 클래스, 객체 개념 다루기 (5) | 2022.03.07 |
직렬화(serialization) (0) | 2021.05.11 |
I/O 스트림 정의 (0) | 2021.05.09 |
자바의 예외 처리 - 로그 남기기(log) (0) | 2021.05.09 |