멀티 스레드(Multi thread)
스레드에 대한 개념을 설명하기 전, 스레드는 프로세스 내에 존재하는 것이므로 프로세스에 대한 개념을 간략히 설명한다.
프로세스(process)
운영체제에서 실행 중인 하나의 애플리케이션을 프로세스라고 부른다.
사용자가 애플리케이션을 실행하면 운영체제로부터 실행에 필요한 메모리를 할당받아 애플리케이션의 코드를 실행하는데, 이때 실행되는 애플리케이션이 프로세스이다.
작업 관리자를 켰을 때 프로세스 탭에 출력되는 게 프로세스다. 우리가 크롬이나 엣지를 사용해 인터넷을 볼 때 작업 관리자의 프로세스 탭에 크롬이나 엣지가 나타난다. 이처럼 크롬과 엣지도 프로세스이다.
만약 인터넷 창을 여러 개 띄워서 사용하기 위해 크롬 창을 여러 개 띄운다면, 이것이 멀티 프로세스다.
스레드(thread)
스레드는 사전적으로 한가닥의 실이라는 의미이다. 한 가지 작업을 실행하기 위해 순차적으로 실행할 코드를 한가닥의 실처럼 이어놓았다는 의미로 해석하여 스레드라는 말을 사용한다.
하나의 스레드는 하나의 코드 실행 흐름이다. 한 프로세스 내 스레드가 두 개라면, 두 개의 실행 코드 흐름이 생긴다는 뜻이다.
멀티 스레드는 카카오톡과 같은 메신저를 예시로 들 수 있다. 메신저는 하나의 프로세스인데, 메신저 내에서 채팅을 하며 파일 전송 또한 할 수 있다. 채팅 기능이 한 개의 스레드이고, 파일 전송도 한 개의 스레드이므로 메신저라는 하나의 프로세스 내 두 개의 스레드가 동작하는 것이다.
멀티 스레드는 대용량 데이터의 처리 시간을 줄이기 위해 데이터를 분할해서 병렬로 처리하는 곳에서 사용되기도 하고, UI를 가지고 있는 애플리케이션에서 네트워크 통신을 하기 위해 사용되기도 한다. 또한 다수 클라이언트의 요청을 처리하는 서버를 개발할 때에도 사용된다.
동시성과 병렬성
멀티 스레드에서 동시성(Concurrency)은 하나의 코어에서 멀티 스레드가 번갈아가며 실행하는 성질을 말한다.
병렬성(Parallelism)은 멀티 코어에서 개별 스레드를 동시에 실행하는 성질을 말한다.
싱글 코어 CPU를 이용한 멀티 스레드 작업은 동시성 작업이다. 병렬성 작업처럼 보일 수 있지만, 하나의 코어를 사용해서 스레드를 번갈아 실행하는 것이므로 동시성 작업이다. 번갈아 실행하는 것이 빠르게 반복되다보니 병렬성 작업으로 보일 수 있다.
동시성 작업처럼 스레드의 개수가 코어의 개수보다 많은 경우 스레드를 어떤 순서에 의해 실행할 것인가를 결정해야 한다. (항시 스레드의 개수가 코어의 개수보다 많지는 않다.) 이때 스레드 스케줄링을 통해 스레드가 실행되는 순서가 정해진다.
멀티 태스킹(Multi tasking)
멀티 태스킹은 두 가지 작업을 동시에 처리하는 것이다.
운영체제는 멀티 태스킹을 위해 CPU와 메모리 자원을 프로세스마다 적절하게 할당하고 병렬로 실행시킨다.
프로세스도 동시에 두 가지 작업을 처리할 수 있고, 스레드도 동시에 두 가지 작업을 처리할 수 있다. 따라서 멀티 태스킹은 멀티 프로세스 또는 멀티 스레드 한 가지만을 뜻하지 않고, 두 가지를 모두 포함한다.
멀티 프로세스는 운영체제에서 할당받은 자신의 메모리를 가지고 실행하기 때문에 서로 독립적이다. 따라서 한 프로세스에서 오류가 발생해도 다른 프로세스에게 영향을 미치지 않는다. 문서 작업 중이던 워드에서 문제가 발생해도 크롬이 함께 종료되진 않는다.
하지만 멀티 스레드는 하나의 프로세스 내에 생성되므로 같은 프로세스 내 다른 스레드와 메모리를 공유하고, 하나의 스레드가 예외를 발생시키면 프로세스 자체가 종료될 수 있다. 이는 동일한 프로세스에서 실행되던 다른 스레드에 영향을 미친다. 메신저의 경우 파일을 전송하는 스레드에서 예외가 발생하면 메신저 프로세스가 종료된다. 스레드가 실행 중이던 프로세스 자체가 종료되는 것이니, 메신저 프로세스 내에서 실행 중이던 채팅 스레드도 같이 종료된다.
멀티 프로세스와 멀티 스레드에 대한 그림을 예시를 들어 살펴보면 다음과 같다.

한 개의 애플리케이션 내에서 4개의 프로세스가 동작 중이다. 이를 멀티 프로세스라고 말한다.
프로세스 1, 3, 4 내에서는 각각 스레드 2개, 3개, 2개가 동작 중이므로 이는 멀티 스레드이다.
프로세스 2 내에서는 스레드가 한 개만 동작 중이니 싱글 스레드이다.
작업 스레드
멀티 스레드로 실행하는 애플리케이션을 개발하기 위해서는 몇 개의 작업을 병렬로 실행할지 결정하고, 각 작업별로 스레드를 생성해야 한다.
메인 스레드(main thread)
모든 자바 애플리케이션은 메인 스레드가 main() 메서드를 실행하면서 시작된다. 따라서 어떤 자바 애플리케이션이건 메인 스레드는 반드시 존재한다.
메인 스레드는 main() 메서드의 첫 코드부터 아래로 순차적으로 실행하고, main() 메서드의 마지막 코드를 만나거나 return문을 만나면 종료된다.
메인 스레드는 필요한 작업 스레드를 만들어 병렬로 코드를 실행할 수 있다. 즉, 메인 스레드에서 멀티 스레드를 생성하여 멀티 태스킹을 수행하는 것이다. 메인 스레드가 종료된다 하더라도, 실행 중인 다른 작업 스레드가 하나라도 존재하면 프로세스는 종료되지 않는다.

작업 스레드는 메인 작업 이외에 추가적인 병렬 작업의 수만큼 스레드를 생성하면 된다. 위 예시는 두 개의 병렬 작업이 필요하다고 가정하여 두 개의 작업 스레드를 생성하였다.
자바에서는 작업 스레드도 객체로 생성되므로 클래스가 필요하다. java.lang.Thread 클래스를 직접 객체화하거나, Thread를 상속하여 하위 클래스를 객체화하여 생성할 수도 있다.
멀티 스레드(Multi thread)
스레드에 대한 개념을 설명하기 전, 스레드는 프로세스 내에 존재하는 것이므로 프로세스에 대한 개념을 간략히 설명한다.
프로세스(process)
운영체제에서 실행 중인 하나의 애플리케이션을 프로세스라고 부른다.
사용자가 애플리케이션을 실행하면 운영체제로부터 실행에 필요한 메모리를 할당받아 애플리케이션의 코드를 실행하는데, 이때 실행되는 애플리케이션이 프로세스이다.
작업 관리자를 켰을 때 프로세스 탭에 출력되는 게 프로세스다. 우리가 크롬이나 엣지를 사용해 인터넷을 볼 때 작업 관리자의 프로세스 탭에 크롬이나 엣지가 나타난다. 이처럼 크롬과 엣지도 프로세스이다.
만약 인터넷 창을 여러 개 띄워서 사용하기 위해 크롬 창을 여러 개 띄운다면, 이것이 멀티 프로세스다.
스레드(thread)
스레드는 사전적으로 한가닥의 실이라는 의미이다. 한 가지 작업을 실행하기 위해 순차적으로 실행할 코드를 한가닥의 실처럼 이어놓았다는 의미로 해석하여 스레드라는 말을 사용한다.
하나의 스레드는 하나의 코드 실행 흐름이다. 한 프로세스 내 스레드가 두 개라면, 두 개의 실행 코드 흐름이 생긴다는 뜻이다.
멀티 스레드는 카카오톡과 같은 메신저를 예시로 들 수 있다. 메신저는 하나의 프로세스인데, 메신저 내에서 채팅을 하며 파일 전송 또한 할 수 있다. 채팅 기능이 한 개의 스레드이고, 파일 전송도 한 개의 스레드이므로 메신저라는 하나의 프로세스 내 두 개의 스레드가 동작하는 것이다.
멀티 스레드는 대용량 데이터의 처리 시간을 줄이기 위해 데이터를 분할해서 병렬로 처리하는 곳에서 사용되기도 하고, UI를 가지고 있는 애플리케이션에서 네트워크 통신을 하기 위해 사용되기도 한다. 또한 다수 클라이언트의 요청을 처리하는 서버를 개발할 때에도 사용된다.
동시성과 병렬성
멀티 스레드에서 동시성(Concurrency)은 하나의 코어에서 멀티 스레드가 번갈아가며 실행하는 성질을 말한다.
병렬성(Parallelism)은 멀티 코어에서 개별 스레드를 동시에 실행하는 성질을 말한다.
싱글 코어 CPU를 이용한 멀티 스레드 작업은 동시성 작업이다. 병렬성 작업처럼 보일 수 있지만, 하나의 코어를 사용해서 스레드를 번갈아 실행하는 것이므로 동시성 작업이다. 번갈아 실행하는 것이 빠르게 반복되다보니 병렬성 작업으로 보일 수 있다.
동시성 작업처럼 스레드의 개수가 코어의 개수보다 많은 경우 스레드를 어떤 순서에 의해 실행할 것인가를 결정해야 한다. (항시 스레드의 개수가 코어의 개수보다 많지는 않다.) 이때 스레드 스케줄링을 통해 스레드가 실행되는 순서가 정해진다.
멀티 태스킹(Multi tasking)
멀티 태스킹은 두 가지 작업을 동시에 처리하는 것이다.
운영체제는 멀티 태스킹을 위해 CPU와 메모리 자원을 프로세스마다 적절하게 할당하고 병렬로 실행시킨다.
프로세스도 동시에 두 가지 작업을 처리할 수 있고, 스레드도 동시에 두 가지 작업을 처리할 수 있다. 따라서 멀티 태스킹은 멀티 프로세스 또는 멀티 스레드 한 가지만을 뜻하지 않고, 두 가지를 모두 포함한다.
멀티 프로세스는 운영체제에서 할당받은 자신의 메모리를 가지고 실행하기 때문에 서로 독립적이다. 따라서 한 프로세스에서 오류가 발생해도 다른 프로세스에게 영향을 미치지 않는다. 문서 작업 중이던 워드에서 문제가 발생해도 크롬이 함께 종료되진 않는다.
하지만 멀티 스레드는 하나의 프로세스 내에 생성되므로 같은 프로세스 내 다른 스레드와 메모리를 공유하고, 하나의 스레드가 예외를 발생시키면 프로세스 자체가 종료될 수 있다. 이는 동일한 프로세스에서 실행되던 다른 스레드에 영향을 미친다. 메신저의 경우 파일을 전송하는 스레드에서 예외가 발생하면 메신저 프로세스가 종료된다. 스레드가 실행 중이던 프로세스 자체가 종료되는 것이니, 메신저 프로세스 내에서 실행 중이던 채팅 스레드도 같이 종료된다.
멀티 프로세스와 멀티 스레드에 대한 그림을 예시를 들어 살펴보면 다음과 같다.

한 개의 애플리케이션 내에서 4개의 프로세스가 동작 중이다. 이를 멀티 프로세스라고 말한다.
프로세스 1, 3, 4 내에서는 각각 스레드 2개, 3개, 2개가 동작 중이므로 이는 멀티 스레드이다.
프로세스 2 내에서는 스레드가 한 개만 동작 중이니 싱글 스레드이다.
작업 스레드
멀티 스레드로 실행하는 애플리케이션을 개발하기 위해서는 몇 개의 작업을 병렬로 실행할지 결정하고, 각 작업별로 스레드를 생성해야 한다.
메인 스레드(main thread)
모든 자바 애플리케이션은 메인 스레드가 main() 메서드를 실행하면서 시작된다. 따라서 어떤 자바 애플리케이션이건 메인 스레드는 반드시 존재한다.
메인 스레드는 main() 메서드의 첫 코드부터 아래로 순차적으로 실행하고, main() 메서드의 마지막 코드를 만나거나 return문을 만나면 종료된다.
메인 스레드는 필요한 작업 스레드를 만들어 병렬로 코드를 실행할 수 있다. 즉, 메인 스레드에서 멀티 스레드를 생성하여 멀티 태스킹을 수행하는 것이다. 메인 스레드가 종료된다 하더라도, 실행 중인 다른 작업 스레드가 하나라도 존재하면 프로세스는 종료되지 않는다.

작업 스레드는 메인 작업 이외에 추가적인 병렬 작업의 수만큼 스레드를 생성하면 된다. 위 예시는 두 개의 병렬 작업이 필요하다고 가정하여 두 개의 작업 스레드를 생성하였다.
자바에서는 작업 스레드도 객체로 생성되므로 클래스가 필요하다. java.lang.Thread 클래스를 직접 객체화하거나, Thread를 상속하여 하위 클래스를 객체화하여 생성할 수도 있다.