BOOK

[JAVA] MENTOR JAVA SECTION 18

Minch13r 2025. 1. 25. 19:00

프로세스와 스레드

동시에 여러가지 일을 할 수 있는 것은 사람뿐만 아니라 컴퓨터도 가능하다. 워드로 문서를 작성하면서 음악을 듣고, 동시에 메신저를 한다. 이처럼 동시에 두 가지 이상의 작업을 처리하는 것을 멀티태스킹이라고 한다. 이 멀티태스킹을 위한 두 가지 도구가 있는데 프로세스와 스레드이다. 

 

프로그램은 파일이 존재하지만 아직 메모리에 올라가 있지 않은 상태, 즉 실행되지 않은 코드의 집합을 말한다. 프로그램을 실행하는 순간 메로리에 올라가고 동작하게 되는데 이 상태의 프로그램을 프로세스라고 한다. 이러한 프로셋 내부에 존재하면서 실행 흐름을 나타내는 것을 스레드라고 한다. 하나의 프로세스 안에서 다양한 작업을 동시에 하기 위해 스레드가 각자 독립적으로 존재하여 일을 수행하게 된다. 하나의 프로세스는 적어도 한 개의 스레드를 지니게 된다.


스레드의 사용

자바에서 스레드를 생성하는 방법은 두가지 방법이 있다.

  • Thread 클래스를 상속하여 run() 메서드 구현
  • Runnable 인터페이스 구현

스레드는 클래스에 Thread를 상속받은 다음, Thread가 가지고 있는 run() 메서드를 사용해 생성한다. 만약 클래스 상속이 어려운 경우에는 Runnable 인터페이스를 상속해 구현할 수 있다.

 

Runnable 인터페이스를 상속하여 구현할 수 있는데 Thread th = new Thread(Runnalbe을 상속한 인스턴스); 이와 같이 클래스를 선언하면서 Runnable을 상속한 클래스를 선언하며 매개변수로 넘겨줘야 한다. 실제 Thread 클래스가 스레드를 실행하는 주체이고, Runnable 인터페이스를 상속한 클래스는 실행 코드를 지닌 객체이기 때문이다.

 

스레드는 다중 실행이 가능하다. 따라서 현재 진행 중인 스레드가 어떤 작업을 하는지 알기 위해서 이름을 부여할 수 있다. Thread-n 이라는 이름으로 자동 설정되는데, 다른 이름으로 설정하고 싶다면 setName() 메서드를 사용해 변경한다.

[Thread 클래스 상속]

public class MyTast extends Thread {
	public MyTask(){
    	setName("myTask-1");
    }
}

 

Thread 클래스를 상속할 경우, 상위 클래스 Thread가 가진 setter 메서드인 setName(String name)을 사용하여 이름을 지정할 수 있다.

[ Runnable 인터페이스 상속 ]
Runnable task = () → {
	...
};

Thread myThread = new Thread(task);
myThread.setName("Thread-blue");

 

이와 같이 thread를 선언한 후 이름을 부여할 수 있다.

 

여러 개의 스레드를 이용해 동시에 작업을 수행할 수 있는데, 이것이 바로 울기 앞에서 설명한 멀티 스레드이다. 같은 시간에 서로 다른 독립적인 스레드가 일을 처리하는 것을 비동기 작업이라고 한다.


스레드 동기화

멀티 스레드 프로그램이 실행될 때 다수의 스레드가 하나의 데이터를 공유하면서 스레드 간의 경쟁이 일어날 수 있다. 경쟁이 정상적으로 이루어진다면 별문제가 없겠지만 간혹 스레드 사이에서 자원 소유의 순서가 잘못되어 예상치 못한 결과가 나타나게 된다. 예를 들어, 두 개의 스레드가 서로 같은 계좌에 동시에 입금을 진행한다고 가정했을 때, 잔고가 0원인 사애에서 1,000원씩 입금하면 2,000원이 된다. 하지만 스레드의 순서가 서로 맞지 않을 경우 비정상적인 동작이 일어날 수 있다.

 

멀티 스레드 프로그램에서 단 하나의 스레드만 처리할 수 있는 영역을 '임계 영역'이라고 한다. 하나의 스레드가 이 영역에 진입할 때 락을 걸어 다른 스레드가 수행되지 못하도록 하고 작업이 종료되면 락을 풀어서 다른 스레드가 작업하도록 하는 것을 '동기화 처리'라고 한다. 이러한 동기화 처리를 위해서는 synchronized 키워드를 사용해 메서드 단위로 처리가 가능하다.

public synchronized void add() ...

스레드 상태

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

상태 상수 설명
생성 NEW 스레드 객체가 생성되었지만 아직 start() 메서드가 호출되지 않은 상태
대기 RUNNABLE 실행 대기 또는 실행 상태로 언제든지 갈 수 있는 상태
일시정지 WATING 다른 스레드가 종료될 떄까지 대기하는 상태
TIMED-WATING 주어진 시간 동안 대기하는 상태
BLOCKED 락이 풀릴 때까지 대기하는 상태
종료 TERMINATED 수행을 종료한 상태

 

스레드의 상태는 생성, 대기, 일시정지, 종료까지 4가지로 구분하며, 상태 구분에 따른 값을 상수로 가지고 있다.

 

처음 스레드가 생성되면 스레드는 NEW 상태가 된다. 생성 이후에 start() 메서드를 실행하면 스레드는 RUNNABLE 상태로 변하고 시작 이후에 스레드가 종료되면 TERMINATED 상태가 된다

 

스레드 WAIT 상태는 필요에 의해서 스레드를 잠시 멈춤 상태로 두는 것을 의미한다. 스레드를 잠시 멈춤 상태로 만들 때는 일정 시간을 지정하거나 멈춤 상태의 락이 풀릴 때까지 대기하도록 만들 수 있다.

 

sleep(int mils) 메서드는 주어진 시간 동안 스레드를 정시시키는 메서드이다. 해당 기능은 모든 스레드를 대기시키며, 주어진 시간이 지나면 풀리게 된다.

 

wait() 메서드는 스레드를 대기시키고, notify() 메서드는 대기 중인 스레드를 다시 동작시킬 때 사용한다.

'BOOK' 카테고리의 다른 글

[HTML] Chapter 1  (1) 2025.02.19
[JAVA] MENTOR JAVA SECTION 19  (1) 2025.01.26
[JAVA] MENTOR JAVA SECTION 17  (3) 2025.01.24
[JAVA] MENTOR JAVA SECTION 16  (2) 2025.01.23
[JAVA] MENTOR JAVA SECTION 15  (1) 2025.01.22