[Java] 자바의 스레드(Thread)와 동기화(Synchronization) (2)


바로가기 >> 자바의 스레드와 동기화 (1)

 

스레드의 상태

new
스레드를 객체 생성한 상태이다. Thread 클래스를 상속받거나 Runnable 인터페이스를 구현한 클래스르르 new 하는 경우이다.

runnable
생성된 스레드의 start 메소드를 호출한 상태이다. 스레드가 실제로 실행되지 않으며 실행하기 위한 준비단계이다.

running
실제로 스레드가 동작하는 상태. runnable 상태의 스레드를 스케쥴러에 의해서 running 상태로 이동, 즉 run 메소드를 실행하고 있는 상태이다.

block
running 되고 있던 스레드가 run 메소드를 모두 샐행하지 못하고 중지되어 있는 상태이다. 입출력이나 인터럽트 요청 같은 경우에 발생되며 sleep, yield, join 같은 메소드 요청시에도 발생 될 수 있다.

dead
running 되고 있던 스레드가 run 메소드를 모두 실행하여 스레드가 제거되는 상태.

 

blocking 메소드
스레드는 우선권 방식으로 실행되기 때문에 우선권이 낮은 스레드는 최악의 경우 running 되지 못하고 항상 runnable 상태로 있을 수도 있다. 이러한 상태를 기아(stavation)상태라고 하는데 이를 방지하기 위해 우선권이 낮은 스레드에게도 실행될 수 있는 기회를 줘야한다.

sleep 메소드
아무 일도 하지 않고 주어진 시간이 경과되기만을 기다리는 메소드

sleep 메소드 사용방법

Thread.sleep(1/1000초);

 

public class Test01 {

	public static void main(String[] args) {
		Hi h = new Hi();
		Bye b = new Bye();

		Thread t1 = new Thread(h);
		Thread t2 = new Thread(b);

		t1.start();
		t2.start();
	}

}

class Hi implements Runnable {
	public void run() {
		int i=0;
		while(i<100) {
			System.out.println("hi");
			i++;
		}
	}
}

class Bye implements Runnable {
	public void run() {
		
		try {
			Thread.sleep(1000); // sleep 메소드 사용 
		} catch (InterruptedException e) {
			e.printStackTrace();
		};
		
		int i=0;
		while(i<100) {
			System.out.println("bye");
			i++;
		}
	}
}

 

yield 메소드
다른 스레드에게 기회를 주기 위해서 사용된다. 우선권이 동일한 스레드에게 실행할 기회를 제공한다.

yield 메소드 사용방법

Thread.yield();

 

public class Test01 {

	public static void main(String[] args) {
		Hi h = new Hi();
		Bye b = new Bye();

		Thread t1 = new Thread(h);
		Thread t2 = new Thread(b);

		t1.start();
		t2.start();
	}

}

class Hi implements Runnable {
	public void run() {
		int i=0;
		while(i<100) {
			System.out.println("hi");
			i++;
		}
	}
}

class Bye implements Runnable {
	public void run() {
		
		Thread.yield(); // yield 메소드 사용
		
		int i=0;
		while(i<100) {
			System.out.println("bye");
			i++;
		}
	}
}

yield 메소드 사용으로 우선권을 넘겨주지만 항상 동일한 결과가 나온다는 보장은 없다.

 

join 메소드
스레드의 종료 순서를 지정하기 위해 사용된다.

public class Test01 {

	public static void main(String[] args) {
		Hi h = new Hi();
		Bye b = new Bye();

		Thread t1 = new Thread(h);
		Thread t2 = new Thread(b);

		t1.start();
		t2.start();
		
		try {
			t1.join(); // join 메소드 사용
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("hi 종료"); // t1 스레드가 종료된 후에 실행된다. 
	}
}

class Hi implements Runnable {
	public void run() {
		int i=0;
		while(i<100) {
			System.out.println("hi");
			i++;
		}
	}
}

class Bye implements Runnable {
	public void run() {
		int i=0;
		while(i<100) {
			System.out.println("bye");
			i++;
		}
	}
}

 

자바의 스레드와 동기화 (3) 에서 이어집니다..

바로가기 >> 자바의 스레드와 동기화 (3)

답글 남기기