본문 바로가기
~2024.10

[JAVA] 자바에서 스레드를 구현하는 두 가지 방법(JAVA 5 이전)

by HJfan 2024. 6. 2.

🙏 포스팅을 읽기 전 참고해 주세요 🙏

해당 블로그는 비전공 신입 개발자가 공부한 내용을 기록 용도로 운영하는 공간입니다.

최대한 오피셜한 내용을 작성하려고 노력하고 있지만, 일부 부정확한 정보가 포함되어 있을 수 있습니다.

해당 내용은 댓글이나 메일을 남겨주시면 즉시 확인 후 조치를 취하도록 하겠습니다. 감사합니다.


0️⃣ 서론

아래에서 설명하는 두 가지 방법은 JAVA5 이전에 사용되던 고전적인 방법이라고 한다.
현재는 스레드 풀을 효율적으로 사용할 수 있도록 지원하는 ExecutorService나 비동기 작업 결과를 확인할 수 있는
Future, 인터페이스와 대용량 데이터 처리에 유용한 Fork/Join 프레임워크 등의 도구들을 사용하여 스레드를
구현한다고 하니까, 당장 스레드를 구현해야 하는 사람이라면 해당 내용을 찾아보는 것을 추천한다.
본 블로그에서는 추후 위 내용들에 대해 다루어 보고자 한다.

 

1️⃣ Thread를 구현하는 두 가지 방법(JAVA 5 이전)

스레드나 프로세스의 정의에 대한 설명은 생략하고, 자바에서 스레드를 구현하는 두 가지 방법에 대해 설명하겠다.

Thread 클래스를 상속 받는 방법

//Thread 클래스를 상속 받아 구현하는 방법
class Thread1 extends Thread{
    @Override
    public void run(){
	//스레드에서 동작할 코드 작성
   }
}

 

Runnable 인터페이스를 구현하는 방법

//Runnable 인터페이스를 구현 받아 구현하는 방법
class Thread2 implements Runnable{ 
    @Override
    public void run() {
	//스레드에서 동작할 코드 작성
    }
}

 

2️⃣ 두 방법의 차이

두 방법 모두 스레드 구현을 위해 run이라는 추상 메소드를 오버라이드 해야 한다.
하지만 자바는 하나의 클래스만 상속받을 수 있다는 제한이 있기 때문에,
일반적으로 스레드를 구현할 때는 Runnable 인터페이스를 구현하는 방법을 선호한다.
즉, 스레드를 구현하면서 다른 클래스에서 제공하는 기능을 사용해야 하는 경우나 스레드의 실행 코드를
다양한 스레드에서 재사용해야 할 경우 Runnable을 구현하는 방법이 적합한 것이다.


반면 Thread 클래스에는 run 추상 메소드 외에도 sleep이나 interrupt 등 스레드를 직접적으로 컨트롤할 수 있는
메소드들이 제공되기 때문에 간단하게 Thread를 구현하고 싶거나, 스레드 관련 메소드를 직접 활용 및 확장해야
할 필요가 있을 경우 채택하곤 한다.

✔️ sleep(long) : 매개변수로 전달한 값의 ms만큼 스레드를 정지하는 메소드
✔️ interrupt() : 스레드가 일시정지 상태에 있을 때, Interrupt Exception을 발생시키는 메소드

✔️ Runnable 인터페이스를 구현하는 경우 Runnable이 하나의 추상 메소드만 갖는 함수형 인터페이스이기 때문에 람다식으로
      사용할 수 있다고 한다. 즉 위 예제에서 사용된 것처럼 새로운 클래스를 생성하지 않고도 스레드를 생성할 수 있는 것이다.

 

3️⃣ 인스턴스 생성 방법

    //Thread 클래스를 상속 받은 경우 인스턴스 생성
    
    public static void main(String[] args) {
        Thread1 thread1 = new Thread1(); // 인스턴스 생성
        thread1.start(); // 스레드 시작
    }
   //Runnable 인터페이스를 구현한 경우 인스턴스 생성
   
    public static void main(String[] args) {
        Runnable myRunnable = new MyRunnable(); // Runnable 인터페이스 구현체 인스턴스 생성
        Thread thread2 = new Thread(myRunnable); // Thread 인스턴스에 Runnable 인스턴스를 전달
        thread2.start(); // 스레드 시작
    }
//람다 표현식을 적용한 Runnable 인터페이스로 스레드 생성 방법

public class Main {
    public static void main(String[] args) {
        Thread thread3 = new Thread(() -> doWork());
        thread.start(); // 스레드 시작
    }

    public static void doWork() {
        // 복잡한 로직 실행
    }
}

 

4️⃣ 구현한 스레드를 실행하는 방법

이미 위 예제 코드들에 정리되어 있지만, Thread 인스턴스를 참조하는 참조 변수.start()로 실행하면 된다.

5️⃣ 추가로 공부하고 싶다면?

스케줄링, 동기화, 데드락, 스레드 우선 순위 등과 상단에 언급된 스레드 관리 기술들을 공부하는 것을 추천한다.
본인도 해당 내용들을 공부 후 정리할 예정이다.

 

 

 

 


📝 Reference

👉 https://mangkyu.tistory.com/258

👉 https://gksdudrb922.tistory.com/157