본문 바로가기
카테고리 없음

자바 Thread(스레드) 사용법 & 예제

by kangs' tong 2023. 11. 29.

자바 Thread(스레드) 사용법

1. 스레드 생성하기

자바에서 스레드를 사용하려면 Thread 클래스를 상속받아 새로운 클래스를 정의하거나, Runnable 인터페이스를 구현하여 클래스를 정의해야 합니다. 두 가지 방법의 차이는 단순히 상속과 구현에만 있을 뿐, 동작 방식은 동일합니다.

class MyThread extends Thread {
    public void run() {
        // 스레드 동작 코드
    }
}

class MyRunnable implements Runnable {
    public void run() {
        // 스레드 동작 코드
    }
}

2. 스레드 시작하기

스레드가 생성되면 start() 메소드를 호출하여 스레드를 시작할 수 있습니다. start() 메소드는 스레드를 실행하는 데 필요한 JVM의 내부 자원을 할당하고 run() 메소드를 실행시킵니다.

Thread myThread = new MyThread();
myThread.start();

3. 스레드 동작 제어하기

3-1. sleep()

sleep() 메소드는 스레드를 잠시 일시 정지시키는 역할을 합니다. 이를 통해 다른 스레드에게 실행 시간을 양보할 수 있습니다.

try {
    Thread.sleep(1000);
} catch (InterruptedException e) {
    // 예외 처리 코드
}

3-2. join()

join() 메소드는 특정 스레드의 종료를 기다리는 역할을 합니다. 즉, 다른 스레드가 종료될 때까지 현재 스레드는 대기합니다.

Thread myThread = new MyThread();
myThread.start();

try {
    myThread.join();
} catch (InterruptedException e) {
    // 예외 처리 코드
}

4. 스레드 우선순위 설정하기

스레드에는 우선순위를 설정할 수 있는데, 이를 통해 어떤 스레드가 CPU 자원을 우선적으로 점유할지 결정할 수 있습니다. 우선순위는 1에서 10까지의 값을 가지며, 기본값은 5입니다.

myThread.setPriority(7);

5. 스레드 상태 참조하기

스레드의 상태는 getState() 메소드를 사용하여 확인할 수 있습니다. 주요한 스레드 상태는 다음과 같습니다.

  • NEW: 스레드가 생성되었지만 아직 start() 메소드가 호출되지 않음
  • RUNNABLE: 실행 중인 스레드
  • BLOCKED: 동기화 블록에 의해 일시 정지된 스레드
  • WAITING: wait() 메소드에 의해 일시 정지된 스레드
  • TIMED_WAITING: sleep()이나 join() 메소드에 의해 일시 정지된 스레드
  • TERMINATED: 종료된 스레드
Thread.State state = myThread.getState();

자바 Thread 예제

1. 스레드를 활용한 숫자 출력

아래 예제는 스레드를 사용하여 1부터 10까지의 숫자를 출력하는 간단한 프로그램입니다.

class NumberPrinter implements Runnable {
    private int start;
    private int end;

    public NumberPrinter(int start, int end) {
        this.start = start;
        this.end = end;
    }

    public void run() {
        for (int i = start; i <= end; i++) {
            System.out.println(i);
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                // 예외 처리 코드
            }
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Thread t1 = new Thread(new NumberPrinter(1, 5));
        Thread t2 = new Thread(new NumberPrinter(6, 10));
        t1.start();
        t2.start();
    }
}

2. 스레드 우선순위 설정하기

아래 예제는 스레드 우선순위를 설정하여 두 개의 스레드가 번갈아가며 실행되는 프로그램입니다.

class PrintThread implements Runnable {
    private String message;
    private Thread nextThread;

    public PrintThread(String message) {
        this.message = message;
    }

    public void setNextThread(Thread nextThread) {
        this.nextThread = nextThread;
    }

    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(message);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // 예외 처리 코드
            }
            Thread.yield();
            nextThread.start();
            try {
                nextThread.join();
            } catch (InterruptedException e) {
                // 예외 처리 코드
            }
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Thread t1 = new Thread(new PrintThread("Hello"));
        Thread t2 = new Thread(new PrintThread("World"));
        t1.setPriority(Thread.MAX_PRIORITY);
        t2.setPriority(Thread.MIN_PRIORITY);
        t1.setNextThread(t2);
        t2.setNextThread(t1);
        t1.start();
    }
}

마무리

이 포스팅에서는 자바에서 스레드를 사용하는 방법과 스레드의 예제를 소개했습니다. 스레드를 활용하면 동시에 여러 작업을 수행할 수 있으며, 운영체제의 자원을 효율적으로 활용할 수 있습니다. 다만, 스레드의 동기화와 관련된 문제에 주의해야 하며, 적절한 동기화를 통해 경쟁 상태나 데드락 등의 문제를 방지해야 합니다.

댓글