기타/프로그래밍 분류

JAVA - 스레드의 상태변이

zelkova 2013. 10. 16. 20:20

 <목차로 돌아가기>


스레드는 기본적으로 생성, 실행가능, 실행, 실행 중지, 종료 상태를 가진다.



생성상태

1. 생성 상태는 스레드의 최초 상태로서 스레드를 생성만하고 시작하지 않은상태

2. 생성 상태에서 start() 메소드를 호출하면 자바 가상 머신은 스레드를 실행하기 위한 자원을 할당한 후 스레드 상태를 실행가능 상태로 전이 한다.


java.lang.Thread 클래스의 메소드

void

start()

스레드를 실행한다. 자바가상머신은 스레드의 run() 메소드를 호출한다.


실행가능 상태

1. 실행가능 상태는 생성 상태에서 start()메소드를 호출한 상태

2. 실행가능 상태는 스레드가 실행되지 못하고 있는 상태

3. 실행가능 상태의 스래드는 스케쥴링 알고리즘에 의해 선택되어 실행 상태로 전이 가능


실행 상태

1. 싱행가능 상태에 있는 스레드가 스케쥴링 알고리즘에 의해 선택되어 실행되거 있는 상태

2. 실행 상태의 스레드는 스케쥴링, wait(), sleep(), I/O발생으로 실행중지 상태로 상태 전이 가능


java.lang.Thread 클래스의 메소드

static void 

sleep(long millis)

지정된 밀리세컨드 millisecond 동안 스레드를 쉬게 한다.


static void

sleep(long millis, int nanos)

지정된 밀리세컨드와 나노세컨드 동안 스레드를 쉬게 한다.


void

join()

이 스레드가 종료될 때까지 대기한다.


void

join(long millis)

이 스레드가 종료될 때까지 지정된 밀리세컨드 동안 대기한다.


static void

yield()

다른 스레드가 실행될 수 있도록 현재 실행중인 스레드를 대기시킨다.


java.lang.Object 클래스의 메소드

void

wait(long timeout)

notify(), notifyAll() 메소드가 호출되거나 지정된 시간이 경과될 때까지 대기한다. 지정된 시간은 millisecond이다.


void 

wait(long timeout, int nanos)

notify(), notifyAll() 메소드가 호출되거나 지정된 시간이 경과될 때까지 대기한다. 지정된 시간은 millisecond단위인 timeout과 nanosecond단위인 nanos를 지정된 시간이다.


실행중지 상태

1.실행가능 상태에 잇는 스레드가 wait(), sleep()메소드를 호출하거나 입출력(I/O) 작업으로 스레드 실행이 중지된 상태()waiting, sleeping, blocking state)

2. 스레드가 다시 실행가능 상태로 전이되기 위해서는 실행중지 상태로 전이시킨 원인이 해소되어야 함

3. wait()메소드가 호출된 경우에는 notify(), notifyAll() 메소드가 호출

4. sleep() 메소드가 호출된 경우에는 지정된 시간이 경과

5. 입출력(I/O) 작업일 경우에는 입출력 작업이 종료


java.lang.Thread클래스의 메소드

void 

interrupt()

지정된 스레드에 인터럽션을 보낸다.


boolean

isInterrupted()

지정된 스레드의 인터럽트 여부를 반환한다.


java.lang.Object클래스의 메소드

void

notify()

이 객체의 모니터상에서 기다리고 있는 하나의 스레드를 깨운다.


void 

notifyAll()

이 객체의 모니터상에서 기다리고 있는 모든 스레드를 깨운다.


종료상태

1. 종료 상태는 스레드가 어떤 일도 할 수 없는 상태

2. 종료 상태에서는 실행가능 상태나 실행중지 상태든 어떤 상태로도 다시 전이될 수 없음

3. 스레드가 종료 상태로 전이되기 위해서는 스레드의 run() 메소드가 정상적으로 종료되어야 함


스레드 스케쥴링

스레드는 대기 상태에서 실행 상태로 전이될 수 있다. 이때 여러 개의 스레드 중에서 어떤 스레드를 실행 상태로 전이시키는 지는 고정 우선순위 스케쥴링알고리즘에 의해 결정된다. 


java.lang.Thread 클래스의 필드

static int 

MAX_PRIORITY

스레드가 가질 수 있는 최대 우선순위


static int

MIN_PRIORITY

스레드가 가질 수 있는 최소 우선순위(0)


static int

Norm_priority

스레드가 가질 수 있는 기본 우선순위(5)


java.lang.Thread 클래스의 메소드

int 

getPriority()

스레드의 우선순위를 반환한다.


void setPriority(int nowPriority)

현재 스레드의 우선순위를 지정된 nowPriority로 변경한다.

예제)

class RunThead extends Thread {

public RunThread(String name){

super(name);

}

public void run(){

for(int i = 1; i <= 30000; i++){

if(i % 50000 == 0)

System.out.println("Thread[" + getName() + "] : " + i );

}

}

}


public class Test{

public static void main(String args[]) {

Thread[] t = new RunThread[2];


t[0] = new RunThread("dog");

t[1] = new RunThread("cat");


t[0].start();

t[1].start();


t[1].setPriority(t[0].MAX_PRIORITY);

}

}


동기화 

여러 스레드가 동시에 사용하는 자원의 상태는 어떻게 변할지 알기가 어렵다. 그래서 이를 예측 가능한 상태로 유지하기 위해서는 synchronized 제한자를 사용해야 한다.

1. synchronized 제한자를 사용하여 동기화를 구현

2. synchronized 제한자는 생성자에 선언할 수 없음

3. synchronized 제한자는 메소드 또는 블록에 선언할 수 있음


예제)

class Counter {

int count = 0;

public synchronized void inc(){

count = count +1;

}

}


예제)

class Counter {

int count = 0;

public void inc(){

synchronized(this){

count = count +1;

}

}

}



반응형