Java를 배워보자/6. 스레드

자바 스레드 생성 및 실행

_Blue_Sky_ 2024. 9. 27. 08:40
728x90

자바 스레드 생성 및 실행: 상세 가이드

서론

자바에서 스레드는 프로그램 실행의 가장 작은 단위입니다. 하나의 프로그램 내에서 여러 작업을 동시에 수행하고자 할 때 스레드를 사용합니다. 예를 들어, GUI 프로그램에서 버튼 클릭 이벤트 처리와 백그라운드에서 큰 파일 다운로드 작업을 동시에 수행하는 경우가 있습니다. 이러한 상황에서 스레드를 활용하면 사용자 인터페이스가 멈추지 않고 원활하게 작동할 수 있습니다.

이 글에서는 자바 스레드 생성 및 실행에 대한 모든 것을 상세히 다룹니다. 스레드 생성 방법, start() 메소드와 run() 메소드의 차이, 스레드 상태, 스레드 간의 동기화, 그리고 스레드 사용 시 주의해야 할 점까지 폭넓게 설명합니다.

1. 스레드 생성 방법

자바에서 스레드를 생성하는 방법은 크게 두 가지가 있습니다.

1.1 Thread 클래스 상속

  • Thread 클래스를 상속받아 새로운 클래스를 생성합니다.
  • 상속받은 클래스에서 run() 메소드를 오버라이딩하여 스레드가 수행할 작업을 정의합니다.
  • start() 메소드를 호출하여 스레드를 실행합니다.
 
class MyThread extends Thread {
    @Override
    public void run() {
        // 스레드가 수행할 작업
        for (int i = 0; i < 10; i++) {
            System.out.println("Thread is running: " + i);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start();
    }
}
 

1.2 Runnable 인터페이스 구현

  • Runnable 인터페이스를 구현한 클래스를 생성합니다.
  • run() 메소드를 구현하여 스레드가 수행할 작업을 정의합니다.
  • Thread 클래스의 생성자에 Runnable 객체를 전달하여 스레드를 생성합니다.
 
class MyRunnable implements Runnable {
    @Override
    public void run() {
        // 스레드가 수행할 작업
        for (int i = 0; i < 10; i++) {
            System.out.println("Thread is running: " + i);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Thread thread = new Thread(new MyRunnable());
        thread.start();
    }
}
 

Runnable 인터페이스를 사용하는 것이 일반적으로 권장되는 이유:

  • 단일 상속 제한 해결: 자바는 클래스가 하나의 부모 클래스만 상속할 수 있도록 제한합니다. Runnable 인터페이스를 사용하면 다른 클래스를 상속받으면서 동시에 스레드 기능을 추가할 수 있습니다.
  • 객체지향적 설계: Runnable 인터페이스는 스레드의 동작을 캡슐화하여 코드의 재사용성과 유지보수성을 높입니다.

2. start() 메소드와 run() 메소드

  • start() 메소드:
    • 새로운 스레드를 생성하고, run() 메소드를 호출하여 스레드를 실행합니다.
    • 스레드는 start() 메소드 호출 이후 JVM 스케줄러에 의해 독립적으로 실행됩니다.
  • run() 메소드:
    • 스레드가 실제로 수행할 작업을 정의하는 메소드입니다.
    • start() 메소드를 통해 스레드가 시작되면 JVM 스케줄러에 의해 run() 메소드가 호출됩니다.

3. 스레드 상태

스레드는 생성, 실행, 대기, 종료 등 다양한 상태를 가질 수 있습니다.

  • 생성(New): 스레드 객체가 생성되었지만 아직 시작되지 않은 상태
  • 실행 가능(Runnable): 스레드가 실행될 준비가 되어 있지만, CPU 시간을 할당받지 못한 상태
  • 실행(Running): CPU 시간을 할당받아 실제로 작업을 수행하는 상태
  • 대기(Blocked): 다른 스레드나 자원을 기다리고 있는 상태
  • 종료(Terminated): 스레드가 작업을 완료하거나 예외가 발생하여 종료된 상태

4. 스레드 간의 동기화

여러 개의 스레드가 공유 자원에 접근할 때 발생할 수 있는 문제를 해결하기 위해 동기화가 필요합니다. 자바에서는 synchronized 키워드, Lock 인터페이스, Atomic 클래스 등을 사용하여 스레드 간의 동기화를 구현할 수 있습니다.

5. 스레드 사용 시 주의해야 할 점

  • 데드락: 두 개 이상의 스레드가 서로 상대방이 획득한 자원을 기다리면서 영원히 블록되는 현상
  • 라이브락: 스레드들이 계속해서 상태를 변경하지만 진행이 되지 않는 현상
  • 경쟁 조건: 여러 스레드가 동시에 공유 자원에 접근하여 예상치 못한 결과가 발생하는 현상

결론

자바 스레드는 프로그램의 성능을 향상시키고 복잡한 작업을 효율적으로 처리하는 데 필수적인 요소입니다. 하지만 스레드를 사용할 때는 동기화 문제, 데드락, 라이브락 등 다양한 문제가 발생할 수 있으므로 주의해야 합니다. 이 글에서 설명한 내용을 바탕으로 스레드를 효과적으로 활용하여 안정적인 프로그램을 개발할 수 있기를 바랍니다.

 

728x90

'Java를 배워보자 > 6. 스레드' 카테고리의 다른 글

자바 스레드 동기화  (0) 2024.09.27
자바 스레드 개념  (0) 2024.09.27