Thread

자바에서 Thread 만들기

Thread 란?

  • process 실행 중인 프로그램 프로그램이 실행되면 OS로 부터 메모리를 할당받아 프로세스 상태가 됨

  • thread 하나의 프로세스는 하나 이상의 thread를 가지게 되고, 실제 작업을 수행하는 단위는 thread임

thread

multi-threading

  • 여러 thread가 동시에 수행되는 프로그래밍, 여러 작업이 동시에 실행되는 효과

  • thread는 각각 자신만의 작업 공간을 가짐 ( context )

  • 각 thread 사이에서 공유하는 자원이 있을 수 있음 (자바에서는 static instance)

  • 여러 thread가 자원을 공유하여 작업이 수행되는 경우 서로 자원을 차지하려는 race condition이 발생할 수 있음

  • 이렇게 여러 thread가 공유하는 자원중 경쟁이 발생하는 부분을 critical section 이라고 함

  • critical section에 대한 동기화( 일종의 순차적 수행)를 구현하지 않으면 오류가 발생할 수 있음

critical

자바 Thread 만들기

Thread 클래스 상속하여 만들기

Runnable 인터페이스 구현하여 만들기

  • 자바는 다중 상속이 허용되지 않으므로 이미 다른 클래스를 상속한 경우 thread를 만들기 위해 Runnable interface를 구현하도록 한다.

Thread Status

status

Thread 클래스의 여러 메서드들

Thread 우선순위

  • Thread.MIN_PRIORITY(=1) ~ Thread.MAX_PRIORITY(=10)

  • 디폴트 우선순위 : Thread.NORMAL_PRIORITY(=5)

  • 우선 순위가 높은 Thread가 CPU의 배분을 받을 확률이 높다

  • setPriority()/getPriority()

  • Thread 우선순위 예제

join()

  • 동시에 두 개 이상의 Thread가 실행 될 때 다른 Thread의 결과를 참조 하여 실행해야 하는 경우 join() 함수를 사용

  • join() 함수를 호출한 Thread가 not-runnable 상태가 감

  • 다른 Thread의 수행이 끝나면 runnable 상태로 돌아옴

join
  • 1부터 50, 51부터 100 까지의 합을 구하는 두 개의 Thread를 만들어 그 결과를 확인해보세요

interrupt()

  • 다른 Thread에 예외를 발생시키는 interrupt를 보낸다.

  • Thread가 join(), sleep(), wait() 함수에의해 not-runnable 상태일 때 interrupt() 메서드를 호출하면 다시 runnable 상태가 될 수 있음

Thread 종료하기

  • Thread를 종료할 때 사용함

  • 무한 반복의 경우 while(flag)의 flag 변수값을 false로 바꾸어 종료를 시킴

  • Thread 종료하기 예제

    세 개의 thread를 만든다. 각각 무한 루프를 수행하게 한다. 작업 내용 this.sleep(100);

    ‘A’ 를 입력 받으면 첫 번째 thread를 ‘B’ 를 입력 받으면 두 번째 thread를 ‘C’ 를 입력 받으면 세 번째 thread를 ‘M’을 입력 받으면 모든 thread와 main() 함수를 종료한다.

멀티 Thread 프로그래밍에서의 동기화

critical section 과 semaphore

  • critical section 은 두 개 이상의 thread가 동시에 접근 하는 경우 문제가 생길 수 있기 때문에 동시에 접근할 수 없는 영역

  • semaphore 는 특별한 형태의 시스템 객체이며 get/release 두 개의 기능이 있다.

  • 한 순간 오직 하나의 thread 만이 semaphore를 얻을 수 있고, 나머지 thread들은 대기(blocking) 상태가 된다.

  • semaphore를 얻은 thread 만이 critical section에 들어갈 수 있다.

semaphore
  • Park 과 ParkWife 가 동시에 Bank 자원에 접근하여 작업이 이루어지는 경우의 예제

동기화 (synchronization)

  • 두 개의 thread 가 같은 객체에 접근 할 경우, 동시에 접근 함으로써 오류가 발생

  • 동기화는 임계영역에 접근한 경우 공유자원을 lock 하여 다른 thread의 접근을 제어

  • 동기화를 잘못 구현하면 deadlock에 빠질 수 있다.

자바에서는 synchronized 메서드나 synchronized 블럭을 사용

synchronized 블럭

-현재 객체 또는 다른 객체를 lock으로 만든다.

synchronized 메서드

  • 객체의 메소드에 synchronized 키워드 사용

  • 현재 이 메서드가 속해있는 객체에 lock을 건다.

  • 자바에서는 deadlock을 방지하는 기술이 제공되지 않으므로 되도록이면 synchronized 메서드에서 다른 synchronized 메서드는 호출하지 않도록 한다.

  • deadlock의 예

deadlock

wait()/notify() 에서드를 활용한 동기화 프로그래밍

  • 리소스가 어떤 조건에서 더 이상 유효하지 않은 경우 리소스를 기다리기 위해 Thread 가 wait() 상태가 된다.

  • wait() 상태가 된 Thread은 notify() 가 호출 될 때까지 기다린다.

  • 유효한 자원이 생기면 notify()가 호출되고 wait() 하고 있는 Thread 중 무작위로 하나의 Thread를 재시작 하도록 한다.

  • notifyAll()이 호출되는 경우 wait() 하고 있는 모든 Thread가 재시작 된다.

  • 이 경우 유효한 리소스만큼의 Thread만이 수행될 수 있고 자원을 갖지 못한 Thread의 경우는 다시 wait() 상태로 만든다.

  • 자바에서는 notifyAll() 메서드의 사용을 권장한다.

  • 도서관에서 책을 빌리는 예제

notify()를 사용하는 경우

notifyAll()을 사용하는 경우

lendBook()/ returnBook() 메서드 수정

Last updated