14.1 멀티 스레드 개념

운영체제는 실행 중인 프로그램을 프로세스로 관리함. 멀티 태스킹은 두 가지 이상의 작업을 동시에 처리하는 것을 말하는데, 이때 운영체제는 멀티 프로세스를 생성해서 처리함. 하지만 멀티 태스킹이 꼭 멀티 프로세스를 뜻하지는 않음.

하나의 프로세스가 두 가지 이상의 작업을 처리할 수 있는 이유는 멀티 스레드가 있기 때문임. 스레드는 코드의 실행 흐름을 말하는데, 프로세스 내에 스레드가 두 개라면 두 개의 코드 실행 흐름이 생긴다는 의미임.

멀티 프로세스가 프로그램 단위의 멀티 태스킹이라면 멀티 스레드는 프로그램 내부에서의 멀티 테스킹이라고 볼 수 있음. 다음 그림은 멀티 프로세스와 멀티 스레드의 차이점을 보여줌.

image.png

멀티 프로세스들은 서로 독럽적이므로 하나의 프로세스에서 오류가 발생해도 다른 프로세스에게 영향을 미치지 않음. 하지만 멀티 스레드는 프로세스 내부에서 생성되기 때문에 하나의 스레드가 예외를 발생시키면 프로세스가 종료되므로 다른 스레드에게 영향을 미침.

멀티 스레드는 데이터를 분할해서 병렬로 처리하는 곳에서 사용하기도 하고, 안드로이드 앱에서 네트워크 통신을 하기 위해 사용하기도 함. 또한 다수의 클라이언트 요청을 처리하는 서버를 개발할 때에도 사용 됨. 프로그램 개발에 있어서 멀티 스레드는 꼭 필요한 기능이기 때문에 반드시 이해하고 활용할 수 있도록 함.

14.2 메인 스레드

모든 자바 프로그램은 메인 스레드가 main() 메소드를 실행하면서 시작됨. 메인 스레드는 main() 메소드의 첫 코드부터 순차적으로 실행하고, main() 메소드의 마지막 코드를 실행하거나 return 문을 만나면 실행을 종료함.

public static void main(String[] args) {
	String data = null;
	if(...) {
	}
	while(...) {
	}
	System.out.println("...");
}

메인 스레드는 필요에 따라 추가 작업 스레드들을 만들어서 실행시킬 수 있음.

image.png

싱글 스레드에서는 메인 스레드가 종료되면 프로세스도 종료됨. 하지만 멀티 스레드에서는 실행 중인 스레드가 하나라도 있다면 프로세스는 종료되지 않음. 메인 스레드가 작업 스레드보다 먼저 종료되더라도 작업 스레드가 계속 실행 중이라면 프로세스는 종료되지 않음.

14.3 작업 스레드 생성과 실행

멀티 스레드로 실행하는 프로그램을 개발하려면 먼저 몇 개의 작업을 병렬로 실행할지 결정하고 각 작업별로 스레드를 생성해야 함.

image.png

자바 프로그램은 메인 스레드가 반드시 존재하기 때문에 메인 작업 이외에 추가적인 작업 수만큼 스레드를 생성하면 됨. 자바는 작업 스레드도 객체로 관리하므로 클래스가 필요함. Thread 클래스로 직접 객체를 생성해도 되지만, 하위 클래스를 만들어 생성할 수 있음.

Thread 클래스로 직접 생성

java.lang 패키지에 있는 Thread 클래스로부터 작업 스래드 객체를 직접 생성하려면 다음과 같이 Runnable 구현 객체를 매개값으로 갖는 생성자를 호출하면 됨.

Thread thread = new Thread(Runnable targer);