자바

Thread란 무엇인가[Java]

연향동큰손 2025. 3. 2. 22:59

 

Thread란

하나의 프로세스 내에서 실행되는 흐름의 단위를 말한다. 

 

일반적으로 자바 애플리케이션을 만들어 실행하면 1개의 메인 쓰레드에 의해 프로그램이 실행된다.

 

하지만 1개의 쓰레드 만으로는 동시에 여러 작업을 할 수 없다.

 

동시에 여러 작업을 처리하고 싶다면, 별도의 쓰레드를 만들어 실행시켜줘야 하는데,

 

자바는 멀티 스레드 기반으로 동시성 프로그래밍을 지원하기 위한 방법을 계속 발전시켜 왔다.

 


 

Thread 클래스

 

Thread 클래스는 자바에서 기본적으로 제공하는 스레드 클래스이며, 이를 상속하면 새로운 스레드를 만들 수 있다.

 

Thread 클래스를 상속받아 run() 메서드를 오버라이딩하여 실행시킬 코드를 정의한다.

 

class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName() + " 실행 중: " + i);
        }
    }
}

public class ThreadExample {
    public static void main(String[] args) {
        MyThread thread1 = new MyThread();
        MyThread thread2 = new MyThread();

        thread1.start();  // 새로운 스레드 실행
        thread2.start();  // 새로운 스레드 실행
    }
}

 

여기서 run을 직접 호출하지 않고 start를 호출해야한다!

 

왜냐하면 해당 메소드의 실행을 별도의 쓰레드로 분리해야 하는데, run을 직접 호출하면 메인 스레드에서 객체의 메소드를

 

호출하는 것에 불과하기 때문이다.

 

따라서 별도의 쓰레드로 분리하여 멀티 쓰레드로 실행하기 위해 JVM(Java Virtual Machine)의 도움받아야 한다.

 

start() 메서드를 호출하면, JVM이 새로운 스레드(Thread) 를 생성하고 실행 스케줄을 관리해준다.


 

Runnable 인터페이스

 

 

Runnable은 인터페이스이며, run() 메서드를 오버라이딩하여 스레드가 실행할 작업을 정의한다.

@FunctionalInterface
public interface Runnable {

    public abstract void run();
    
}

 

 

 

사용할때는 Runnable 인터페이스의 run()메서드를 원하는 로직에 맞게 구현해주어 사용하면 된다.

public class MyRunnableImpl implements Runnable {
	@Override
	public void run() {
		System.out.println("MyRunnableImpl is running");
	}
}

 

public static void main(String[] args) {
	Runnable myRunnable = new MyRunnableImpl();
	Thread myThread= new Thread(myRunnable);
	myThread.start(); // MyRunnableImpl is running
}

 


 

Thread와 Runnable 비교

 

Java에서는 다중 상속이 불가능하므로 Thread클래스를 상속받으면 다른 클래스를 상속받을 수 없다는 단점이 있다.

 

또한 Thread클래스를 상속받으면 Thread 클래스에 구현된 코드들에 의해 더 많은 자원(메모리 OR 시간)을 필요로 하므로

 

Runnable이 주로 사용된다.

  Runnable Thread
람다 가능 O X
상속 필요 X O
자원 사용량 적음 많음

 

'자바' 카테고리의 다른 글

추상 메서드, 추상 클래스, 익명 내부 클래스[Java]  (0) 2025.03.12
동시성 문제를 해결하기 위한 ThreadLocal[java]  (0) 2025.03.05
예외  (0) 2025.02.02
HashMap  (0) 2024.02.21
Iterator  (2) 2024.02.21