💡 복습해보자
- 운영체제에서 실행 중인 하나의 애플리케이션을 프로세스 라고 한다.
- 하나의 애플리케이션은 다중 프로세스를 만들기도 한다. → 멀티 태스킹 처리
- 멀티 태스킹은 두 가지 이상의 작업을 동시에 처리하는 것을 말한다.
- 운영체제는 멀티 태스킹을 할 수 있도록 CPU 및 메모리 자원을 프로세스마다 적절히 할당해주고, 병렬로 실행시킨다.- 어떻게 하나의 프로세스가 두 가지 이상의 작업을 처리할 수 있을까 ? → 멀티 스레드
스레드(thread)는 한 가지 작업을 실행하기 위해 순차적으로 실행할 코드 흐름을 말한다.
멀티 프로세스가 애플리케이션 단위의 멀티 태스킹이라면, 멀티 스레드는 애플리케이션 내부에서의 멀티 태스킹이라고 볼 수 있다.
위 그림과 같이 멀티 프로세스들은 운영체제에서 할당받은 자신의 메모리를 가지고 실행하기 때문에 서로 독립적이다. 다시 말해, 하나의 프로세스에서 오류가 발생하더라도 다른 프로세스에 영향을 미치지 않는다.
⚠️ 그러나 멀티 스레드는 하나의 프로세스 내부에 생성되기 때문에 하나의 스레드가 예외를 발생시키면 프로세스 자체가 종료될 수 있다 !
모든 자바 애플리케이션은 메인 스레드(main thread)가
main()
메소드를 실행하면서 시작된다.
메인 스레드는 main()
메소드의 첫 코드부터 아래로 순차적으로 실행하고, main()
메소드의 마지막 코드를 실행하거나 return문을 만나면 실행이 종료된다.
즉, 멀티 스레드를 생성해서 멀티 태스킹을 수행한다.
멀티 스레드로 실행하는 애플리케이션을 개발하려면 먼저 몇 개의 작업을 병렬로 실행할지 결정하고 각 작업별로 스레드를 생성해야 한다.
java.lang.Thread
클래스를 직접 객체화해서 생성해도 되지만, Thread를 상속해서 하위 클래스를 만들어 생성할 수도 있다.
✅ 코드 형태: Runnable
을 매개값으로 갖는 생성자를 호출한다.
Thread thread = new Thread(Runnable target);
Runnable
은 작업 스레드가 실행할 수 있는 코드를 가지고 있는 객체이다.Runnable
은 인터페이스 타입이다. → 구현 객체를 만들어 대입해야 한다 !Runnable
의 run()
메소드를 재정의해서 작업 스레드가 실행할 코드를 작성한다.
class Task implements Runnable {
public void run() {
스레드가 실행할 코드;
}
}
Runnable
은 작업 내용을 가지고 있는 객체이지 실제 스레드가 아님을 주의하자 !
💡 Runnable
구현 객체를 생성한 후, 이것을 매개값으로 해서 Thread 생성자를 호출하면 작업 스레드가 생성된다.
Runnable task = new Task();
Thread thread = new Thread(task); // 매개값으로 받아서 사용한다.
💡 위 코드를 절약하기 위해 익명 객체를 매개값으로 사용할 수 있다. (이 방법이 많이 사용됨)
Thread thread = new Thread(new Runnable { ┐
public void run() { │
스레드가 실행할 코드; │ 익명 구현 객체
} │
}); ┘
💡 가장 간단한 방법으로는, 람다식을 매개값으로 사용할 수도 있다.
Thread thread = new Thread(() -> { ┐
스레드가 실행할 코드; │ 람다식
}) ┘