Thread

조상원·2025년 8월 2일

JAVA

목록 보기
28/34

프로세스

  • 운영체제에서 실행 중인 하나의 프로그램(애플리케이션)
  • 프로그램이 실행될 때 마다 개별적으로 생성
  • 하나의 프로그램(애플리케이션)은 다중 프로세스를 만들기도 함

스레드

  • 프로세스 내에서 할당된 자원을 이용해 실제 작업을 수행하는 작업 단위
  • 모든 프로세스는 하나 이상의 스레드를 가지며 각각 독립적인 작업 단위를 가짐
  • 하나의 스레드는 하나의 코드 실행 흐름이기 때문에 한 프로세스 내에 여러 개의 스레드가 존재한다면 여러 개의 실행 흐름이 생긴다는 의미

메인 스레드

  • 모든 자바 프로그램은 메인 스레드가 main() 메소드를 실행하면서 시작
  • 메인 스레드는 main() 메소드의 첫 코드부터 아래로 순차적으로 실행
  • 코드를 모두 실행하거나 return 문을 만나면 프로그램 실행 종료

멀티 스레드

  • 하나의 프로세스 내에서 여러 스레드가 동시에 작업을 수행하는 것
  • 자바 프로그램(애플리케이션)은 메인 스레드가 종료되면 프로세스도 종료되지만 멀티 스레드 프로그램(애플리케이션)의 경우 실행 중인 스레드가 하나라도 있다면 프로세스가 종료되지 않는다.
  • 멀티 스레드 프로그램(애플리케이션)은 하나의 프로세스 내부에 여러 개의 스레드가 생성되기 때문에 하나의 스레드가 예외를 발생시키면 프로세스 자체가 종료될 수 있다.
장점단점
자원을 보다 효율적으로 사용이 가능하다.동기화(Synchronization)에 주의해야 한다.
사용자에 대한 응답성 향상이 향상된다.교착상태(dead-lock)가 발생하지 않도록 주의해야 한다.
애플리케이션의 응답성 향상이 향상된다.프로그래밍 시 고려해야 할 사항이 많다.
작업이 분리되어 코드가 간결해진다.
CPU 사용률이 향상된다.

스레드 생성

  • 자바에서 작업 스레드도 객체로 생성.
  • 관련된 클래스와 인터페이스를 사용해 작업 스레드 생성

java.lang.Thread 클래스를 상속받아 스레드 생성

  • thread 클래스 상속 후 run 메소드를 재정의해서 작업 스레드가 실행할 코드를 작성
public class MyThread extends Thread {

    @Override
    public void run() {
        // 작업 스레드에서 실행할 코드
        ...
    }
}
  • 생성된 작업 스레드 객체에서 start() 메소드를 호출하면 작업스레드는 자신의 run( ) 메소드를 실행
public class Application {
    public static void main(String[] args) {
        MyThread thread = new MyThread(); 

        thread.start();
    }
} 

java.lang.Runnable 인터페이스를 구현하여 스레드를 생성

  • Thread 클래스로부터 직접 작업 스레드 객체를 생성하려면 Runnable 인터페이스의 구현 객체를 매개값으로 갖는 생성자를 호출해야 한다.
public class MyRunnable implements Runnable {

    @Override
    public void run() {
        // 작업 스레드에서 실행할 코드
        ...
    }
}
  • Runnable 인터페이스의 구현 객체를 매개값으로 전달해서 Thread 객체를 생성한다.
  • 생성된 작업 스레드 객체에서 start() 메소드를 호출하면 작업 스레드는 자신의 run()메소드를 실행하게 된다.
public class Application {
    public static void main(String[] args) {
        MyRunnable runnable = new MyRunnable(); 
        
        Thread thread = new Thread(runnable);

        thread.start();
    }
} 
  • 익명 구현 객체를 통해 Runnable 인터페이스를 직접 구현해서 스레드 생성이 가능하다.
public class Application {
    public static void main(String[] args) {
        Thread thread = new Thread(new Runable() {
            
            @Override
            public void run() {
                // 작업 스레드에서 실행할 코드
                ...
            }
        });

        thread.start();
    }
} 

0개의 댓글