The Debugging Chronicles : "코드의 미학"

Mentor JAVA - section18. 스레드 본문

JAVA/Mentor JAVA

Mentor JAVA - section18. 스레드

sweetseonah1004 2024. 7. 29. 19:54

프로세스와 스레드

- 동시에 두가지 이상의 작업을 처리하기 위한 도구들을 말한다.

프로그램 : 파일이 존재하지만 아직 메모리에 올라가 있지 않은 상내를 말한다. (실행되지 않은 코드의 집합)

프로세스 : 프로그램을 실행하는 순간 메모리에 올라가고 동작하게 되는 상태를 말한다. (프로그램의 한 단위)

프로세스는 독립적으로 메모리에 등록되므로 여러 개의 프로그램을 동시에 실행할 수 있게 된다.

하나의 프로세스는 적어도 한 개의 스레드를 지니게 된다.

스레드 : 프로세스 내부에 존재하면서 실행 흐름을 나타내느 것을 말한다. (프로그램 내에서 동작하는 작업 단위)

스레드의 사용

- 스레드를 생성하는 법

1. Thread 클래스를 상속하여 run() 메서드 구현

· 클래스를 실행시키기 위해선 start() 메서드를 호출해야 한다.

package section18;

class MyThread extends Thread {
	@Override
	public void run() {
		int sum = 0;
		for(int i = 0; i < 10; i++) {
			sum = sum + (i+1);
		}
		
		System.out.println("sum = "+sum);
		String threadName = Thread.currentThread().getName();
		System.out.println("현재 스레드 이름 : "+threadName);
	}
}

public class SumMain{
	public static void main(String[] args) {
		MyThread th = new MyThread();
		th.start();
	}
}

 

2. Runnable 인터페이스 구현

· Java는 다중 상속이 불가능하기 때문에 Runnable 인터페이스를 상속하여 구현한다.

· Thread 클래스를 선언하면서 Runnable을 상속한 클래스를 선언하여 매개변수로 넘겨준다.

(Thread 클래스가 스레드를 실행하는 주체이고 Runnable 인터페이스를 상혹한 클래스는 실행 코드를 지닌 객체기 때문이다.)\

Thread th = new Thread(Runnable을 상속한 인스턴스);
// 상속한 인스턴스는 Thread 자체를 상속한 것이 아니므로,
// 해당 객체를 인자로 넣어준다.

 

package section18;

// Runnable을 상속
class WhiteFlag implements Runnable{
	@Override
	public void run() {
		while(true) {
			System.out.println("백기 올려");
		}
	}
}

public class RunnableExample {
	public static void main(String[] args) {
		Thread write = new Thread(new WhiteFlag());
		write.start();
	}
}

- Thread에 이름 부여하기

· 현재 진행중인 스레드가 어떤 작업을 하는지 알기 위해서 이름을 부여한다.

· 생성한 스레드는 'Thread-n'이라는 이름으로 자동 설정되는데, 다른 이름으로 설정하고 싶다면 Thread 클래스의

setName() 메서드를 변경하면 된다.

- 멀티 스레드

· 여러 개의 스레드를 이용해 동시에 작업을 수행하는 것을 말한다.

· 같은 시간에서로 다른 독립적인 스레드가 일을 처리하는 것을 비동기 작업이라고 한다.

 

package section18;

public class RunnableExample {
	public static void main(String[] args) {
		// Runnable 인터페이스를 익명 객체로 처리
		Runnable white = () -> {
			for(int i = 0; i<5; i++) {
				System.out.println("백기 올려");
			}
		};
		
		Runnable blue = () -> {
			for(int i = 0; i<5; i++) {
				System.out.println("청기 올려");
			}
		};
		
		Thread whiteFlag = new Thread(white);
		Thread blueFlag = new Thread(blue);
		whiteFlag.start();
		blueFlag.start();
	}
}

 

 

스레드 동기화

- 스레드 사이에서 자원 소유의 순서가 잘못되어 비정상적인 동작이 일어나는 것을 방지하기 위해 여러 스레드가 하나의 공유 데이터에 동시에

접근하지 못하도록 스레드의 실행을 제어하는 것을 '스레드 동기화'라고 한다.

- 스레드 동기화 처리

하나의 스레드가 임계 영역에 진입할 때 락을 걸어 다른 스레드가 수행되지 못하도록 하고 작업이 종료되면 락을 풀어서

다른 스레드가 작업하도록 하는 것을 '동기화' 처리라고 한다.

임계 영역 : 멀티 스레드 프로그램에서 단 하나의 스레드만 처리할 수 있는 영역

· 메서드 동기화 처리

메서드 이름 앞에 synchronized 키워드를 사용하면 해당 메서드 전체를 동기화 처리할 수 있다.

스레드의 순서는 자원을 점유한 스레드가 우선적으로 작업되므로 순서대로 동작되지는 않지만 서로 간섭하지 못했기 때문에 정상적으로

작동되는 것을 확인할 수 있다.

 

public synchronized void add() ...

 

 


스레드 상태

- 스레드는 생성하고 실행, 종료되기까지 다양한 상태를 가지며, 각 스레드의 상태는 스레드 클래스에 정의되어 Thread State 타입으로

알 수 있다.

- 생성, 대기, 일시정지, 종료 4가지로 구분되며, 상태 구분에 따른 값은 상수로 가지고 있는다.