12-1 / 멀티 스레드

📌 프로세스(process) 

어플리케이션 실행시 운영체제로부터 실행에 필요한 메모리를 할당 받아 실행하는 것

 

📌 스레드(thread)

한가닥의 실. 한가지 작업을 싱해하기 위해 순차적으로 실행할 코드를 실처럼 이어놓았다고 해서 유래된 이름으로 프로세스 내부에서 코드의 실행 흐름을 말한다.

 

 


스레드

운영체제는 두가지 이상의 작업을 동시에 처리하는 멀티 태스킹을 할 수 있도로고 CPU 및 메모리 자원을 프로세스마다 적절히 할당하고 병렬로 실행 시킨다. 

이런 멀티태스킹은 하나의 프로세스 안에서도 이루어질 수 있는데 이것을 멀티 스레드라고 한다.

 

멀티 프로세스는 운영체제에서 할당받은 자신의 메모리를 가지고 실행해 프로세스끼리 독립적이다. 따라서 하나의 프로세스가 오류가 발생해도 다른데에 영향을 주지 않는다.

하지만 멀티 스레드는 하나의 프로세스 내부에 생성되어 있어 하나의 스레드가 예외를 발생시키면 프로세스 자체가 종료될 수 있어 다른 스레드에 영향을 미칠 수 있다. 그렇기에 스레드에서는 예외 처리가 중요하다.

 

 

 


메인 스레드

자바의 모든 어플리케이션은 메인 스레드가 main() 메소드를 실행하면서 시작된다.

첫줄 부터 시작해 아래로 순차적으로 실행하며, main() 메소드의 마지막 코드를 실행하거나 return문을 만나면 실행이 종료되는 데 이 흐름이 메인 스레드다.

메인 스레드는 필요따라 스레드를 더 만들어 멀티 태스킹을 수행할 수 있다. (멀티 스레드)

 

싱글 스레드는 하나의 스레드가 종료되면 프로세스도 종료되지만 멀티 스레드는 하나의 스레드라도 남아 있다면 프로세스가 종료되지 않는다.

 

 

 


작업 스레드 생성과 실행

자바에서는 작업 슬드도 객체로 생성되기 때문에 클래스가 필요하다. java.lang.Thread 클래스를 직접 객체화 하거나 이를 상속해 하위 클래스를 만들어 생성 할 수도 있다.

 

  • Thread 클래스로부터 직접 생성

스레드 객체를 직접 생성하려면 Runnable(실행할수 있는) 매개값을 갖는 생성자를 호출해야 한다.

Thread thread = new Thread(Runnable target);

 

Runnable은 인터페이스 타입이기에 구현 객체를 만들어야 대입해야 하며 그 안의 run() 메소드를 재정의해 작업 스레드가 할 코드를 작성해야 한다.

Runnable은 작업 내용을 가진 객체일 뿐 스레드는 아니기에 이를 매개값으로 해 Thread 생성자를 호출해야 비로소 작업 스레드가 생성된다.

// 1.Runnable 구현 객체
class Task implements Runnable {
    pulic void run(){
    	스레드가 실행할 코드;
    }
}

// 2.스레드 생성
Runnable task = new Task();
Thread thread = new Thread(task);

// 1+2 방법인 익명객체 사용법 (더 많이 사용되는 방법)
Thread thread = new Thread(){
    pulic void run(){
    	스레드가 실행할 코드;
    }
}

// 스레드 시작
thread.start();

 

 

  • Thread 하위 클래스로부터 생성

Thread의 하위 클래스로 작업 스레드를 정의하면서 작업 내용을 포함 시킬수 있다.

그리고 코드 절약위해 이 또한 익명 객체로 생성할 수 있다.

public class WorkerThread extends Thread {
    @Override
    public void run() {
		스레드가 실행할 코드;
	}
}

Thread thread = new WorkerThread();

// 익명 객체 스레드 생성
Thread thread = new Thread(){
    public void run(){
		스레드가 실행할 코드;
	}
}

 

 

  • 스레드의 이름

스레드 또한 이름을 가지고 있다. 이 이름은 디버깅할 대 어떤 스레드가 어떤 작업을 하는 지 조사할 목적으로 사용된다.

 

 


동기화 메소드

  • 공유 객체를 사용할 때의 주의할 점

멀티스레드 프로그램에서 스레드는 같은 객체를 공유해 작업해야하는 경우 A가 사용하던 객체를 B가 사용해 의도치 않은 결과가 나올 수 있다.

 

  • 동기화 메소드

위와 같은 문제가 일어나지 않도록 하나의 스레드가 사용중인 객체에 다른 스레드가 접근 할 수 없도록 해야했다. 그래서 존재하는 것이 단 하나의 스레드만 실행할 수 있는 코드 영역 "임계영역 (Critical Section)"이다.

자바는 임계영역을 지정하기 위해 동기화 메소드를 제공한다.

 

스레드가 객체 내부의 동기화 메소드를 실행하면 즉시 객체에 잠금을 걸어 드란 스레드가 동기화 메소드를 실행 못하게 하는 것인데 이는 메소드 선언시 synchronized 키워드를 붙인다. (인스턴스, 정적 상관없이)

public synchronized void method() {
	임계 영역;
}

 

키워드를 선언해주면 해당 실행 블록 전부가 임계 영역이 되어 스레드가 메소드 실행시 안의 객체에 모두 잠금이 일어나고, 스레드가 해당 메소드를 종료하면 잠금이 풀린다.

 

'Programming > Java' 카테고리의 다른 글

혼공자바] 13-1 컬렉션 프레임  (1) 2022.12.27
혼공자바] 12-2 스레드 제어  (0) 2022.12.19
혼공자바] 11 기본 API 클래스  (0) 2022.12.14
혼공자바] 10-2 예외처리  (0) 2022.12.13
제네릭(Generic)  (0) 2022.12.13

+ Recent posts