Chapter 13 쓰레드

쓰레드란

프로세스 - 실행 중인 프로그램, OS로부터 메모리를 할당 받은 것
쓰레드 - 실제 프로그램이 수행되는 작업의 최소 단위, 하나의 프로세스는 하나 이상의 쓰레드를 가지게 된다.

쓰레드를 구현하는 방법

1) 자바 Thread 클래스로부터 상속받아 구현
2) Runnable 인터페이스 구현 : Thread 객체 생성 후 Thread 인스턴스에 Runnable 객체를 넣어야 한다.

쓰레드 status


쓰레드가 Runnable 한 상태에서 cpu를 점유하게 되는데 스케줄러가 cpu를 배분해주고 쓰레드가 돌다가 끝나면 dead 상태가 된다. sleep(), wait(), join() 메서드에 의해서 쓰레드가 cpu를 점유할 수 없는 Not Runnable 한 상태로 빠지는 경우가 있다. sleep()은 시간이 지나면 wait()는 notify()나 notifyAll()이 호출되면 join()은 다른 쓰레드가 끝나면 다시 Runnable 상태로 온다.
*참고자료 - 패스트 캠퍼스 온라인 강의

쓰레드 우선순위

Thread.MIN_PRIORITY(=1) ~ Thread.MAX_PRIORITY(=10) 이고, 디폴트 우선순위는 Thread.NORM_PRIORITY(=5)를 가진다.
setPriority(int newPriority)나 int getPriority()로 우선순위를 알 수 있다.

쓰레드의 여러 메서드

1) join()
다른 쓰레드의 결과를 보고 진행해야할 일이 있는 경우 사용한다. join() 메서드를 호출한 thread가 non-runnable 상태가 된다.

2) interrupt()
다른 thread 예외를 발생시키는 interrupt를 보내서 thread가 join(), sleep(), wait() 메서드에 의해 블럭킹 되었다면 interrupt에 의해 다시 runnable 상태가 될 수 있다.

3) wait()
리소스가 더 이상 유효하지 않은 경우 리소스가 사용 가능하기 위해 thread를 non-runnable 상태로 전환한다. wait() 상태가 된 쓰레드는 notify()가 호출될 때까지 기다린다.

4) notify()
wait() 하고 있는 쓰레드 중 임의의 한 쓰레드를 runnable 한 상태로 깨운다.

5) notifiyAll()
wait()하고 있는 모든 쓰레드가 runnable 한 상태가 되도록 하는 것으로 notify() 보다 notifyAll() 하기를 권장한다. 모두 깨운 후 스케줄러에 cpu를 점유하는 것이 더 공평하다.

멀티 쓰레드

동시에 여러 개의 Thread가 수행되는 프로그래밍이다. Thread는 각각의 작업공간(context)을 가지는데 공유 자원이 있는 경우 race condition이 발생되고 critical section(프로세스 안에 여러 개의 쓰레드가 있는 경우 쓰레드들이 공유하는 자원의 영역, 임계영역)에 대한 동기화(synchronization)의 구현이 필요하다.

  • critical section
    -두개 이상의 thread가 동시에 접근하게 되는 리소스
    -critical section에 동시에 thread가 접근하게 되면 실행결과를 보장할 수 없고 thread간의 순서를 맞추는 동기화(synchronization)가 필요하다.

동기화 구현 방법

1) synchronized 수행문

synchronized(참조형 수식) {

}
// 참조형 수식에 해당되는 객체에 lock을 건다.

2) synchronized 메서드
현재 이 메서드에 속해 있는 객체가 lock을 건다. deadlock 방지를 위해 synchronized 메서드 내에서 다른 synchronized 메서드를 호출하지 않는다.

좋은 웹페이지 즐겨찾기