본문 바로가기

DEVELOPER/Java

Thread

반응형

Thread 란? 


  • process 실행 중인 프로그램이 실행되면 OS로부터 메모리를 할당받아 프로세스 상태가 됨
  • thread : process는 하나 이상의 thread를 가지게 되고, 실제 작업을 수행하는 단위는 thread 
  • ' 하나의 프로그램이 돌아간다 = 하나 이상의 thread를 갖고 있다 '

process와 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 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 이란

deadlock

 

wait( ) / notify( ) 동기화 프로그래밍

 

① wait( )


리소스가 어떤 조건에서 더 이상 유효하지 않은 경우 리소스를 기다리게 하는 것

 

② notify( )


유효한 리소스가 생기면 notify( )가 호출되고 wait( )이 적용된 Thread는 재시작하게 됨

 

③ notityAll( )


wait( ) 상태 Thread들 모두 재시작

이 경우 유효한 리소스 만큼의 Thread만이 수행되고 리소스를 갖지 못한 thread는 다시 wait( ) 상태가 된다.

 

 

  • wait( ) 상태 Thread들은 notify( )가 호출 될 때까지 기다림
  • wait( ) 상태 Thread가 많으면 notify( )가 호출 됐을 때, 무작위로 재시작을 함
  • 자바에서는 대체적으로 notifyAll( ) 메서드 사용을 권장

 

반응형