[Java] Thread와 Java Thread

2024. 10. 15. 23:25·☕ Java

멀티태스킹(Multitasking)

멀티(Multi) + 태스킹(tasking)의 합성어로서, 다수의 작업을 동시에 처리하는 것이며 하나의 프로그램이 하나의 작업(태스크)만 하는 경우가 대부분이지만, 하나의 프로그램이 여러 작업(태스크)를 동시에 실행하는 경우가 많다.

스레드(Thread)

스레드는 운영 체제에 의해 관리되는 하나의 작업 혹은 테스크(task)를 의미하며 다수의 스레드를 동시에 실행시키도록 응용프로그램을 작성하는 기법을 멀티스레딩이라고 한다. 스레드의 구성 요소로는 스레드 코드와 스레드 정보로 이루어져 있으며, 스레드 코드는 작업을 실해하기 위해 사용자가 작성한 프로그램 코드이며 스레드 정보는 스레드 명, 스레드 ID, 스레드 소요시간, 스레드 우선순위 등 운영체제가 관리하는 정보이다.

멀티태스킹(Multitasking)과 운영체제(OS)

운영체제(OS)와 스레드와의 관계는 프로그램 코드를 스레드로 관리하고 작동시키는 것은 운영체제가 담당하며 개발자는 작성한 코드를 하나의 스레드로 만들어 줄 것을 운영체제에게 요청해야 한다.

멀티태스킹(Multitasking)의 종류

멀티태스킹의 종류로는 멀티프로세싱(Multi-Processing)과 멀티스레딩(Multi-threading)이 있다.

멀티프로세싱은 하나의 응용프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 기법이며 각 프로세스는 고유한 메모리 영역을 보유하고 독립적을 실행된다.

하지만 멀티프로세싱(Multi-Processiong)의 단점으로는 하나의 응용프로그램에 속하는 프로세스들 사이의 변수를 공유할 수 없기 때문에 프로세스들 사이에 사용하는 통신 기법(IPC, Inter Process Communication)이 어렵고 오버헤드가 크다. 또한, 프로세스 사이의 문맥 교환(Context switch)에 따른 과도한 작업량과 시간 소모의 문제점이 있다.

또 하나의 멀티태스킹의 종류로 멀티스레딩(Multi-threading)이 있다고 했는데 멀티태스킹은 하나의 응용프로그램을 여러 개의 스레드로 구성하고 각 스레드로 하여금 하나의 작업을 처리하도록 하는 기법이다.

멀티스레딩(Multi-threading)의 장점은 모든 스레드가 응용프로그램 내 자원과 메모리를 공유하므로 통신에 따른 오버헤드가 비교적 크지 않고, 스레드 사이의 문맥 교환 시 작업량이 작아 문맥 교환이 빠른 장점을 지니며 응용프로그램이 다수의 스레드를 가지고 다수의 작업이나 요청을 동시에 처리함으로써, 여러 작업을 순차적으로 진행하는 경우 시간 지연과 자원의 비효율적 사용을 개선한다.


Java Thread

자바 스레드는 일반 스레드와 별반 차이가 없으며 자바 가상 기계(JVM)이 운영체제 역할을 한다.

자바에는 프로세스가 존재하지 않고 스레드만 존재하며, 자바 스레드는 JVM에 의해 스케줄 되는 실행 단위 코드 블록이다.

 

JVM은 하나의 자바 응용프로그램만 실행이 가능하며, 하나의 응요프로그램이 여러 개의 스레드를 가질 수있다. 스레드 스케줄링은 JVM에서 이루어지며, 스레드가 몇개인지, 스레드로 실행되는 프로그램 코드의 메모리 위치는 어디인지, 스레드의 우선순위는 얼마인지 등 많은 정보는 JVM이 관리한다.

 

Java의 스레드를 만드는 방법은 크게 두가지로 이루어진다.

바로 Thread 클래스를 이용하는 방법과 Runnable 인터페이스를 이용하는 방법이다.

Thread 클래스로 스레드 만드는 방법은 Thread 클래스의 경로명은 java.lang.Thread이며, Thread 클래스를 상속받아 새로운 스레드 코드를 만든다.

 

Thread 클래스의 주요 메소드로 `void run()` 와 `void Start()`를 사용하는데 스레드 코드로서 JVM에 의해 호출된다. 개발자는 반드시 이 메소드를 오버라이딩하여 스레드 코드를 작성해야 한다 `void start()` : JVM에게 스레드 실행을 시작하도록 요청한다.

Thread 클래스를 상속받아 run() 오버라이딩을 한다.

class TimerThread extends Thread{
    @Override
    public void run(){ // thread 클래스의 run() 오버라이딩
        ......
    }
}
  • 자바에서 스레드가 수행할 작업 코드를 반드시 run()메서드에 작성하도록 한다.
  • JVM이 스레드를 실행시키면 스레드는 run()메서드에서부터 실행을 시작되고 run()이 종료되면 스레드도 종료된다.
  • run()을 스레드 코드라고 한다.

1. 스레드 객체 생성

TimerThread th = new TimerThread(); // 스레드 객체 생성
  • TimerThread객체를 생성한 것이지 스레드를 작동시킨 것 아니다.

2. 스레드 시작 : start() 메소드 호출

th.start();
  • Thread 클래스의 start()를 호출하여 JVM이 스레드 th를 스케줄링하도록 한다.
  • start()메서드는 Thread에 클래스에 구현되어 있는 메소드로서, 스레드 객체 th를 JVM에게 새로운 스레드로 인식하고 스케줄링 가능한 상태로 만들 것을 지시한다.
  • JVM이 이 스레드를 스케줄링하면, 그떄 비로소 스레드 th의 run()가 실행된다.
  • 개발자가 start()메소드를 절대 오버라이딩 하면 안된다.

sleep() 메소드

  • 인자값에 따라 스레드의 작동을 일시정지시키는 코드이다.
  • 일시정지동안 이 스레드를 종료시키고자 하는 예외 InterruptedException이 발생할 떄 이를 처리하기 위해 try-catch블록이 삽입되어야 한다.
  • try-catch문 없이 sleep()문을 사용하면 자바 컴파일러는 오류를 발생시킨다.
// Java 스레드 예시 코드
class TimerThread extends Thread{
    int n = 0;

    @Overide
    public void run(){
        whlie(true){
            System.out.println(n);
            n++;
            try{    
                sleep(1000);
            }
            catch(InterruptedException e){
                return;
            }
        }
    }
}

public class TestThread{
    public static void main(String[] args){
        TimerThread th = new TimerThread();
        th.start();
    }
}

// ** 실행 결과 **
// 0
// 1
// 2
// 3
// 4
// .
// .
// .

Runnable 인터페이스로 스레드 만들기

  • Runnable의 경로명은 java.lang.Runnable이며,추상 메서드 run()만 가진 인터페이스이다.
interface Runnable{
    public void run();
}

1. 스레드 클래스 선언 : Runnable 인터페이스 구현

class TimerRunnable implements Runnable{

    @Override
    public void run(){ // Runnable 인터페이스의 run() 메소드 오버라이딩
           .......... 
    }
}
  • run() 메소드에 스레드 코드를 구현한다. run()이 종료되면 스레드도 종료된다.

2. 스레드 객체 생성

  • run()을 오버라이딩한 TimerRunnable의 인스턴스를 생성하고, 다음과 같이 Thread 클래스의 생성자에 전달하면서 스레드 객체를 생성한다.
Thread th = new Thread(new TimerRunnable()); // 스레드 객체 생성

3. 스레드 시작 : start() 메소드 호출

th.start();
  • Thread 클래스의 start()를 호출하여 JVM이 스레드 th를 스케줄링하도록 한다.
  • start()메서드는 Thread에 클래스에 구현되어 있는 메소드로서, 스레드 객체 th를 JVM에게 새로운 스레드로 인식하고 스케줄링 가능한 상태로 만들 것을 지시한다.
  • JVM이 이 스레드를 스케줄링하면, 그떄 비로소 스레드 th의 run()가 실행된다.
  • 개발자가 start()메소드를 절대 오버라이딩 하면 안된다.

Thread 종료

  • 스스로 종료: run()메소드가 종료하거나 리턴하는 경우
  • 강제 종료 : interrupt() 메소드를 호출, IntterruptedException 예외가 발생하기 때문에 try-catch문을 사용한다.

Thread 동기화

멀티스레드 프로그램이 실행될 때, 다수의 스레드가 공유 데이터를 동시에 접근하는 경우가 발생하는데 여러 스레드에 의해 공유 데이터의 값이 비정상적으로 유지되지 않도록 스레드의 실행을 제어하는 기술

Thread 동기화 방법

두가지가 있는데 sychronized로 동기화 블록 지정과 wait() - notify() 메서드로 스레드 실행 순서 제어가 있다.

 

sychronzied 블록

코드 블록을 동기화가 설정된 임계 영역으로 지정하는 방법이 있으며, 메소드를 임계 영역으로 지정하는 방법과 임의의 코드 블록만 지정하는 방법이 있다.

// 1. 메소드를 임계 영역으로 지정하는 방법
sychronized void print(String text){
    ...
    for(int i = 0; i < text.length(); i++){
        System.out.println(text.charAt(i));
    }
}
// 2. 임의의 코드 블록만 지정하는 방법
void execute(String text){
    ...
    synchronized(this){ // 동기화 코드 블록
        ...
        for(int i = 0; i < text.length(); i++){
            System.out.println(text.charAt(i));
        }
    }
}

'☕ Java' 카테고리의 다른 글

[Java] 메모리 영역  (1) 2024.10.16
[Java] 클래스에 대한 캐스팅(Casting)과 오버라이딩(Overriding)  (0) 2024.10.16
[Java] 추상클래스(Abstract class)와 인터페이스(Interface)  (0) 2024.10.16
[Java] 자료형  (0) 2024.10.15
'☕ Java' 카테고리의 다른 글
  • [Java] 메모리 영역
  • [Java] 클래스에 대한 캐스팅(Casting)과 오버라이딩(Overriding)
  • [Java] 추상클래스(Abstract class)와 인터페이스(Interface)
  • [Java] 자료형
kkongdo
kkongdo
kkongdo 님의 블로그 입니다.
  • kkongdo
    숲을 바라보며 나무를 심는 아이
    kkongdo
  • 전체
    오늘
    어제
    • 분류 전체보기 (32)
      • 🌏 Web (0)
      • ☕ Java (5)
      • 🌱 Spring (9)
        • Spring Boot (7)
        • Spring Data JPA & QueryDSL (2)
      • 🗂️ Database (5)
      • 💻 CS (12)
        • 운영체제 (4)
        • 네트워크 (5)
        • 자료구조 (3)
      • 🗃️Git (1)
      • 🔍 Algorithm (0)
      • 📡 DevOps (0)
        • Docker (0)
      • 🔭 ETC (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • GitHub
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    JPA
    spring
    네트워크기기
    OS
    SpringSecurity
    스케줄링
    SpringMVC
    네트워크
    DI
    CS
    @annotation
    db
    springbatch
    자료구조
    조인
    복잡도
    운영체제
    데이터베이스
    java
    QueryDSL
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
kkongdo
[Java] Thread와 Java Thread
상단으로

티스토리툴바