[Java] Chap12 멀티 스레드

Seunghee Lee·2023년 4월 9일
0

Java

목록 보기
12/12

1. 멀티 스레드 개념

💡 복습해보자

  • 운영체제에서 실행 중인 하나의 애플리케이션을 프로세스 라고 한다.
  • 하나의 애플리케이션은 다중 프로세스를 만들기도 한다. → 멀티 태스킹 처리
  • 멀티 태스킹은 두 가지 이상의 작업을 동시에 처리하는 것을 말한다.
    - 운영체제는 멀티 태스킹을 할 수 있도록 CPU 및 메모리 자원을 프로세스마다 적절히 할당해주고, 병렬로 실행시킨다.
  • 어떻게 하나의 프로세스가 두 가지 이상의 작업을 처리할 수 있을까 ? → 멀티 스레드

스레드(thread)는 한 가지 작업을 실행하기 위해 순차적으로 실행할 코드 흐름을 말한다.

멀티 프로세스가 애플리케이션 단위의 멀티 태스킹이라면, 멀티 스레드는 애플리케이션 내부에서의 멀티 태스킹이라고 볼 수 있다.

위 그림과 같이 멀티 프로세스들은 운영체제에서 할당받은 자신의 메모리를 가지고 실행하기 때문에 서로 독립적이다. 다시 말해, 하나의 프로세스에서 오류가 발생하더라도 다른 프로세스에 영향을 미치지 않는다.

⚠️ 그러나 멀티 스레드는 하나의 프로세스 내부에 생성되기 때문에 하나의 스레드가 예외를 발생시키면 프로세스 자체가 종료될 수 있다 !

1) 메인 스레드

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

메인 스레드는 main() 메소드의 첫 코드부터 아래로 순차적으로 실행하고, main() 메소드의 마지막 코드를 실행하거나 return문을 만나면 실행이 종료된다.

💡 메인 스레드는 필요에 따라 작업 스레드들을 만들어서 병렬로 코드를 실행할 수 있다.

즉, 멀티 스레드를 생성해서 멀티 태스킹을 수행한다.


2. 작업 스레드 생성과 실행

멀티 스레드로 실행하는 애플리케이션을 개발하려면 먼저 몇 개의 작업을 병렬로 실행할지 결정하고 각 작업별로 스레드를 생성해야 한다.

💡 자바에서는 작업 스레드도 객체로 생성되기 때문에 클래스가 필요하다.

java.lang.Thread 클래스를 직접 객체화해서 생성해도 되지만, Thread를 상속해서 하위 클래스를 만들어 생성할 수도 있다.

1) Thread 클래스로부터 직접 생성

✅ 코드 형태: Runnable을 매개값으로 갖는 생성자를 호출한다.

Thread thread = new Thread(Runnable target);
  • Runnable작업 스레드가 실행할 수 있는 코드를 가지고 있는 객체이다.

💡 Runnable은 인터페이스 타입이다. → 구현 객체를 만들어 대입해야 한다 !

Runnablerun() 메소드를 재정의해서 작업 스레드가 실행할 코드를 작성한다.

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(() -> {		┐
	스레드가 실행할 코드;					│ 람다식
})

profile
자라나라 개발개발 ~..₩

0개의 댓글