Java 스레드(Thread)

fever·2024년 1월 10일

Java 기초

목록 보기
8/10
post-thumbnail

✨스레드(Thread)

  • 프로그램 내에서 독립적으로 실행될 수 있는 가장 작은 단위로 각각의 스레드는 독립적으로 코드를 실행하고 자신만의 레지스터와 스택을 가지고 있다.

📚 스레드 사용 예시

  1. 동시성 처리 (Concurrency)
    여러 사용자의 요청을 동시에 처리하거나, 여러 작업을 병렬로 실행해 시스템의 성능을 향상시키는데 활용

2.백그라운드 작업 처리
어떤 작업을 메인 프로그램의 실행과 독립적으로 백그라운드에서 처리해야 할 때 스레드를 사용. 예를 들어, 파일 다운로드, 데이터베이스 업데이트, 주기적인 작업 등을 백그라운드 스레드에서 처리 가능

  1. 응답성 향상
    UI (사용자 인터페이스)에서는 사용자의 입력에 빠르게 반응해야 하며 긴 시간 동안 수행되는 작업은 UI를 블록시키기 때문에 백그라운드 스레드에서 해당 작업을 수행함으로써 응답성을 향상

  2. 병렬 처리
    다중 코어 프로세서를 활용하여 여러 작업을 병렬로 처리할 때 스레드를 사용, 이는 대용량 데이터 처리나 계산 위주의 작업에서 성능을 향상

  3. 이벤트 처리
    이벤트 기반 프로그램에서는 이벤트를 처리하는 스레드를 따로 두어 메인 스레드가 다른 작업을 계속 처리 가능

  4. 데드락 피하기
    여러 자원을 사용하는 경우, 데드락을 방지하고 성능을 최적화하기 위해 스레드를 사용할 수 있습니다.

📚 스레드 사용 방법

1.Thread 클래스 상속

class MyThread extends Thread {
    public void run() {
        System.out.println("스레드 동작 중");
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start(); // 스레드 실행
    }
}

2.Runnable 인터페이스 구현

class MyRunnable implements Runnable {
    public void run() {
        System.out.println("스레드 동작 중");
    }
}

public class Main {
    public static void main(String[] args) {
        Thread myThread = new Thread(new MyRunnable());
        myThread.start(); // 스레드 실행
    }
}

3. 두 방식의 차이점

  • Thread를 상속받는 방식은 이미 Thread 클래스를 상속받기 때문에 다른 클래스를 상속받을 수 없음, Java는 단일 상속만 허용하므로 이미 다른 클래스를 상속하고 있는 경우 Runnable을 구현하는 방법이 유용

📚 스레드 예시 코드

  1. 로딩 중 점찍기
public class LoadingThread extends Thread {
    public void run() {
        System.out.print("로딩 중");
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(500); // 0.5초 대기
                System.out.print(".");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("\n로딩 완료");
    }
}

public class Main {
    public static void main(String[] args) {
        LoadingThread loadingThread = new LoadingThread();
        loadingThread.start();
        try {
            loadingThread.join(); // 로딩 스레드가 종료될 때까지 대기
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("메인 작업 계속 진행");
    }
}

💻 출력
로딩 중..........
로딩 완료
메인 작업 계속 진행

profile
선명한 삶을 살기 위하여

0개의 댓글