PSD( Private-Self-Development )

Thread 와 Runnable 본문

Backend/Thread

Thread 와 Runnable

chjysm 2023. 7. 11. 17:40

Thread와 Runnable 은 자바 초기(JAVA 5 이전)부터 멀티스레드를 위해 제공되던 기술이다.

 

Thread

스레드 생성을 위해 Java에서 미리 구현해 둔 클래스

기본 메서드를 제공한다.

  • run
    • 스레드 실행
  • sleep
    • 스레드 멈추기 
    • 자원 할당을 제거하지는 않고, 제어건만 넘겨주므로 데드락 발생 가능성 생김
  • interrupt
    • interruptedException 발생 시킴
    • interrupt가 발생한 스레드는 예외를 catch 하여 다른 작업을 진행 가능
  • join
    • 다른 스레드의 작업이 끝날 때까지 기다리게 함
    • 스레드 간 순서 제어에 사용

 

Thread 장단점

장점

  • 기본 메서드를 제공하기 때문에 이를 오버라이딩 하여 스레드를 상세하게 제어할 수 있다.

단점

  • 기본 메서드를 포함하고 있기에 Runnable 보다 무겁다.
  • 별도의 클래스를 생성해야 한다.

 

Thread 구현

Thread 클래스를 상속받는 클래스를 만들고 run  메서드를 오버라이딩 해야 한다.

class MyThread extends Thread {
    @Override
    public void run() {
    }
}

static void main() {
    Thread thread = new MyThread();
    thread.start(); // run이 아닌 start를 호출
}

 

run 이 아닌 start를 호출하는 이유 

run을 호출하는 것은 메인 스레드에서 객체의 메서드를 실행하는 것뿐이다.

start를 호출해야 별도의 스레드에 할당된다.

 

start 를 호출할 경우, 아래의 과정을 가진다.

  1. 스레드가 실행 가능한지 검사
    1. 스레드는 New, Runnable, Waiting, Timed Waiting, Terminated 5가지 타입을 가진다.  
  2. 스레드를 스레드 그룹( 관련 있는 스레드의 모임 )에 추가
  3. 스레드를 jvm이 실행

 

Runnable

1개의 메서드 만을 갖는 함수형 인터페이스 

때문에, 람다로도 사용 가능하다.

Thread 클래스는 이 Runnable 인터페이스를 구현하고 있다.

 

Runnable 장단점

장점

  • 별도의 클래스가 필요하지 않다.
  • Thread 클래스 대비 가볍다.

 

Runnable 구현

static void main() {
    Runnable runnable = () -> {
    	try{
        	Thread.sleep(100);
        } catch(Exception e){
        }
    };

    Thread thread = new Thread(runnable);
    thread.start();
}

 

Thread와 Runnable의 단점 및 한계

  • 지나치게 저수준의 API(스레드의 생성)에 의존함
  • 값의 반환이 불가능
  • 매번 쓰레드 생성과 종료하는 오버헤드가 발생
  • 스레드들의 관리가 어려움

 

 


참조

https://mangkyu.tistory.com/258

'Backend > Thread' 카테고리의 다른 글

생산자 소비자 패턴  (2) 2024.08.28
BlockingQueue 와 DelayQueue  (0) 2024.08.26
CompletableFuture  (0) 2023.07.12
Callable, Future, Executors, Executor, ExecutorService, ScheduledExecutorService  (0) 2023.07.12
Thread 란?  (0) 2022.11.15