JAVA

[JAVA] Thread 란

날아 2023. 2. 6. 01:10

1. Thread (스레드) 

더보기

스레드란 하나의 작업 단위이다.  

  • Runnable 인터페이스 구현
  • Thread 클래스 상속 

모두 run() 메소드를 오버라이딩 한다. 

public class MyThread implements Runnable {
    @Override
    public void run() {
        // 수행 코드
    }
}
public class MyThread extends Thread {
    @Override
    public void run() {
        // 수행 코드
    }
}

 

하지만 두 방법은 인스턴스 생성 방법에 차이가 있다. 

 

Runnable 인터페이스를 구현한 경우, 해당 클래스를 인스턴스화해서 Thread 생성자에 argument로 넘겨줘야한다. 

그리고 run()을 호출하면 Runnable 인터페이스에서 구현한 run()이 호출되므로 따로 오버라이딩하지 않아도 되는 장점이 있다. 

public static void main(String[] args) {
    Runnable r = new MyThread(); //인스턴스화 
    Thread t = new Thread(r, "mythread");
}

 

Thread 클래스를 상속받은 경우, 상속받은 클래스 자체를 스레드로 사용할 수 있다. 

public class ThreadTest implements Runnable {
    public ThreadTest() {}
    
    public ThreadTest(String name){
        Thread t = new Thread(this, name);
        t.start();
    }
    
    @Override
    public void run() {
        for(int i = 0; i <= 50; i++) {
            System.out.print(i + ":" + Thread.currentThread().getName() + " ");
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

 

Runnable 인터페이스 & Thread 클래스 특징 

 

start()
  • 스레드의 실행은 run() 호출이 아닌 start() 호출로 해야한다. 

 

  우리는 분명 run() 메소드를 정의했는데, 실제 스레드 작업을 시키려면 start()로 작업해야 한다. 

 

  Java에는 콜 스택이 있다. 이 영역이 실질적인 명령어들을 담고 있는 메모리로, 하나씩 꺼내서 실행시키는 역할을 한다. 만약 동시에 두 가지 작업을 한다면 두 개 이상의 콜 스택이 필요하게 된다. 스레드를 이용한다는 것은, JVM이 다수의 콜 스택을 번갈아가며 일처리를 하고 사용자는 동시에 작업하는 것처럼 보여주는 것이다. start() 메소드를 호출하면, JVM은 알아서 스레드를 위한 콜 스택을 만들어주고 context switching을 통해 스레드답게 동작하도록 해준다. 

start()는 스레드가 작업을 실행하는데 필요한 콜 스택을 생성한 다음 run()을 호출해서 그 스택 안에 run()을 저장한다. 

 

스레드의 실행제어 

스레드의 상태는 5가지가 있다. 

  • NEW : 스레드가 생성되고 아직 start()가 호출되지 않은 상태
  • RUNNABLE : 실행 중 또는 실행 가능 상태
  • BLOCKED : 동기화 블럭에 의해 일시정지된 상태(lock이 풀릴 때까지 기다림)
  • WAITING, TIME_WAITING : 실행가능하지 않은 일시정지 상태
  • TERMINATED : 스레드 작업이 종료된 상태

 

데몬 스레드
  • 다른 일반 쓰레드의 작업을 돕는 보조적인 역할을 수행하는 쓰레드
  • ex) 가비지 컬렉터, 워드프로세서의 자동저장, 화면자동갱신