본문 바로가기
쿤즈 Dev/Java

[Java] 스레드(Thread) 기본 정보

by :)Koon 2023. 10. 5.

자바(Java)에서 스레드(Thread)는 동시성 프로그래밍을 구현하기 위한 중요한 개념이다. 스레드를 사용하면 여러 작업을 동시에 수행하거나 병렬로 처리할 수 있다.

이번 포스팅에서는 자바에서 사용하는 스레드에 대해서 알아보자.


스레드 Thread

스레드는 'java.lang.Thread' 클래스이다. 자바에서 스레드를 생성하고 관리하는 데 사용된다. 스레드는 프로세스 내에서 실행되는 가장 작은 실행 단위이다. 즉, 하나의 프로세스가 여러 스레드를 가질 수 있으며, 이러한 스레드는 동일한 메모리 공간을 공유하게 된다.

 

스레드를 생성하기 위해서는 'Thread' 클래스를 상속하거나 'Runnalbe' 인터페이스를 구현하는 방법 중 하나를 택할 수 있다. 이번 포스팅에서는 'Thread'를 상속하는 방법을 알아보자.

 

먼저 아래와 같이 두 개의 스레드 클래스를 만들어 보자.

class ThreadA extends Thread{
    public void print() {
        for(int i=0; i<10; i++) {
            System.out.println("This is ThreadA.");
        }
    }
}

class ThreadB extends Thread{
    public void print() {
        for(int i=0; i<10; i++) {
            System.out.println("This is ThreadB.");
        }
    }
}

두 스레드 'ThreadA'와 'ThreadB'는 각각 'Thread' 클래스를 상속받았다. 그리고 내부에는 'print()' 메서드가 각각 존재한다. 이 두 클래스의 'print()' 메서드를 실행하기 위해서는 아래와 같이 만들 수 있다.

public class ThreadTest {
    public static void main(String[] args) {
        ThreadA threadA = new ThreadA();
        ThreadB threadB = new ThreadB();

        threadA.print();
        threadB.print();
    }
}

 

실행 결과는 아래와 같다.

This is ThreadA.
This is ThreadA.
This is ThreadA.
This is ThreadA.
This is ThreadA.
This is ThreadA.
This is ThreadA.
This is ThreadA.
This is ThreadA.
This is ThreadA.
This is ThreadB.
This is ThreadB.
This is ThreadB.
This is ThreadB.
This is ThreadB.
This is ThreadB.
This is ThreadB.
This is ThreadB.
This is ThreadB.
This is ThreadB.

 

결론부터 말하면 위 경우는 스레드로 실행한 것이 아닌 순차적으로 실행하게 만든 프로그램이다. 'threadA' 인스턴스의 'print' 메서드를 실행하고 그 실행이 끝나면 'threadB' 인스턴스의 'print' 메서드를 실행한 것이다.

 

그렇다면 스레드로 실행하기위해선 어떻게 해야 할까?

우선은 메서드 이름을 아래와 같이 변경해 준다.

class ThreadA extends Thread{
    @Override
    public void run() {
        for(int i=0; i<10; i++) {
            System.out.println("This is ThreadA.");
        }
    }
}

class ThreadB extends Thread{
    @Override
    public void run() {
        for(int i=0; i<10; i++) {
            System.out.println("This is ThreadB.");
        }
    }
}

'Thread' 클래스에는 'run()' 메서드가 존재한다.

이 메서드를 오버라이드해서 재정의를 해준다. 그러면 스레드가 실행될 때 우리가 원하는 기능이 실행될 것이다. 이번에는 테스트 프로그램을 수정해 보자.

public class ThreadTest {
    public static void main(String[] args) {
        ThreadA threadA = new ThreadA();
        ThreadB threadB = new ThreadB();

	// start() 메서드로 수정
        threadA.start(); 
        threadB.start();
    }
}

기존에 메서드를 직접 호출했다면 이제는 'start()' 메서드를 실행해 준다. 그럼 내부적으로 'run()' 메서드까지 호출하고 스레드를 안전하게 종료한다. 물론 이 경우 실행하면 동일한 결과를 볼 수도 있다. 왜냐하면 10개를 출력하는 일은 순식간에 벌어지는 일이기 때문이다. 동시에 실행된다는 결과를 보고 싶다면 내부에 'sleep()' 메서드를 호출해서 멈추거나 100개를 출력하는 방법을 사용하면 A와 B가 순서 없이 호출되는 것을 볼 수 있다.


자바의 스레딩은 강력하며 다양한 동시성 문제를 다룰 수 있다. 그러나 스레드를 올바르게 사용하려면 멀티스레딩의 개념과 스레드 동기화에 대한 이해가 필요하다. 이 주제는 다음 포스팅에서 다뤄볼 예정이다.

댓글