서버 개발/Thread

Java Thread - (1) 기본 개념

Johnny Yoon 2019. 7. 17. 22:11
728x90
반응형

 

Thread란

개념적으로 Thread는 프로그램 내의 Control Flow의 일종입니다.

이는 Process와 비슷한 개념인데, 차이점은 한 어플리케이션의 Thread끼리는 OS Process끼리의 관계보다 더 가까운 개념입니다.

Thread는 기본적으로 프로그램의 모든 객체, 인스턴스, static변수들에 접근이 가능합니다.

하지만 Thread들은 각각 다른 local변수들을 가지고 있게 됩니다.

 

Runnable 인터페이스

자바의 모든 실행기능은 Thread와 연관되어있습니다. 기본적으로는 main Thread가 작업들을 수행합니다.

이 Thread는 생성될 때 매개변수를 통해 수행할 작업을 전달받습니다.

이 작업이 바로 Runnable 입니다. 아래는 Runnable 인터페이스의 정의입니다.

public interface Runnable {
	abstract public void run();
}

Runnable 인터페이스를 상속받는 클래스는 run() 메소드를 구현해야 합니다.

Thread가 이 run() 메소드를 호출해 기능을 수행할 수 있도록 합니다.

 

아래는 Runnable을 상속받는 작업의 예제입니다.

public class CounterRunnable implements Runnable {
    private int counter = 0;
    private boolean running = true;
    
    @Override
    public void run() {
        while (running){
            counter++;
            System.out.println(counter);
            if (counter >= 1000) running = false;
        }
    }
}

 

Thread와 Runnable

Thread가 새로 생성되면 항상 Idle (아무것도 하지 않는) 상태입니다.

따라스 Thread를 일하게 만드려면 start() 메소드를 호출해 주어야 합니다.

이는 Thread의 생명주기 동안 딱 한번 호출될 수 있습니다.

Thread를 만들어 위의 CounterRunnable을 수행하게 할 수 있는 예제입니다:

public class Main {
    public static void main(String[] args) {
        Runnable counter = new CounterRunnable();
        Thread thread = new Thread(counter);
        thread.start();
    }
}

이를 실행하면 CounterRunnable 안의 run()이 실행되면서 counter가 1000이 될때까지 수행할것입니다.

 

보통의 경우 위와같이 실행하는 로직에서 Thread와 Runnable을 따로 작성하지는 않습니다.

대개의 경우 (더 OOP적으로 사용하기 위해) 아래와 같이 Thread객체가 Runnable안쪽에 위치하게 됩니다.

public class CounterRunnable implements Runnable {
    private Thread thread;

    public CounterRunnable(){
        thread = new Thread(this);
        thread.start();
    }

    private int counter = 0;
    private boolean running = true;
    
    @Override
    public void run() {
        while (running){
            counter++;
            System.out.println(counter);
            if (counter >= 1000) running = false;

        }
    }
}

 

Thread 인스턴스

만약 Thread안의 로직이 복잡하지 않은 경우, Runnable을 쓰지 않고, Thread 인스턴스를 따로 만들 수도 있습니다.

Thread를 생명주기를 직접 컨트롤할 일이 있다면 다음 객체를 사용하는것도 될 것 같습니다.

이런 경우 대게는 Wrapper클래스로 한번 감싸준 뒤 컨트롤 하게 됩니다.

아래는 위의 Runnable의 작업을 Thread안에 넣어준 예제입니다.

public class CounterThread extends Thread {
    private int counter = 0;
    private boolean running = true;

    @Override
    public void run() {
        while (running){
            counter++;
            System.out.println(counter);
            if (counter >= 1000) running = false;
        }
    }
}

 

 

참고자료: Learning Java, 4th Edition, Orielly 

 

728x90
반응형

'서버 개발 > Thread' 카테고리의 다른 글

Java Thread - (3) 동기화  (0) 2019.08.05
Java Thread - (2) 제어  (0) 2019.07.19