[Java] Thread 활용하기

    [Java] Thread 활용하기

     

     

     

     

      Thread

     Process(프로세스) 보다 더 작은 단위로, 한 개 이상의 스레드가 작동해야 프로세스가 작동된다.

     

    한 프로세스 안의 복수 개의 스레드가 존재하여, 한 번의 실행으로 여러 개의 작업효과를 나타내기 위해 사용하는 기술이다.

     

    예를 들면, 하나의 업무를 하기 위해 한 사람이 일하는 것과 여러 사람이 같은 일을 처리한다고 생각한다면 보통 여러 사람이 같이 일한다면 금방 끝날 것임을 누구나 쉽게 예측할 수 있다.

     

    마찬가지로 스레드를 사용하고, 알아야 하는 이유는 스레드를 사용하여 작업시간의 단축에 의미를 갖는다.

     

     

    그렇다면, Thread를 왜 사용할까?

    Java는 보통 한 개의 스레드, 프로세스만 사용한다. 한 개의 작업이 실행되는 동안, 다른 작업의 실행은 할 수 없다.

     

    이를 해결하기 위해 Java가 내놓은 기술이며, 이를 활용한다 Java의 여러개의 기능을 동시에 사용할 수 있다는 장점이 생긴다.

     

     

     

      Thread 사용 방법

     스레드를 사용하기 위해서는 대표적으로 2가지 방법이 있다.

    class ThreadEx1_1 extends Thread {
    	public void run() {
    		
    	}
    }
    
    class ThreadEx1_2 implements Runnable {
    	public void run() {
    		
    	}
    }

    첫 번째는 Thread를 상속받는 방법이다. Thread는 언제든지 상속이 가능한 상태이며, 이를 활용하기 위해서는 run이라는 메서드가 필요하다.

     

    두 번째는 Runnable을 implements를 하는 방법이다.

    Runnable이란, Thread를 상속받고 있는 Class이다. 따라서 이를 상속함으로써, 스레드를 사용할 수 있게 도와준다.

     

    보통 두 번째 방법을 선호한다.

    Java의 extends의 상속 방식은 하나의 Class만 가능하기 때문에, 만약 Thread를 사용하기 위해 이 한 번의 상속을 사용한다면 Java의 장점인 상속 기능의 제한이 생기기 때문이다.

     

    그래서 Runnable을 통해 다중 상속 기능으로 Thread를 사용하고, 반드시 run을 오버 라이딩 해야한다.

     

     

     

      Thread 생성 방법

    생성자 설명
    Thread() 가장 일반적인 형태의 생성자다. 이 생성자를 이용해서 Thread 객체를 생성하게 되면 Thread의 이름은 "Thread- +n" 형태가 된다.
    Thread(Runnable target) Runnable 객체를 이용해서 Thread 객체를 생성할 수 있는 생성자다.
    Thread(Runnable target, String name) Runnable 객체를 이용해서 Thread 객체를 생성할 수 있는 생성자며, 스레드의 이름을 지정할 수 있는 생성자다.
    Thread(String name) 스레드의 이름을 지정하면서 Thread 객체를 생성 할 수 있는 생성자다.

     Thread의 생성을 활용하여, Thread의 이름을 지정할 수 있게 도와준다.

     

     

     

      Thread의 생명주기

     Thread의 생명주기는 크게 5가지로 나뉘어진다.

    상태 설명
    New 스레드가 만들어진 상태
    Runnable 스레드 객체가 생성된 후에 start() 메서드를 호출하면 Runnable 상태로 이동된다.
    Running Runnable 상태에서 스레드 스케줄러에 의해 Running 상태로 이동하게 된다.
    Blocked 스레드가 다른 특정한 이유로 Running 상태에서 Blocked 상태로 이동하게 된다.
    Dead 스레드가 종료되면 그 스레드는 다시 시작할 수 없게 된다.

     

     

     

      Thread의 주요 메서드

    메서드 반환형 설명
    sleep(long millis) static void 지정된 시간만큼 대기시킨다. (1초 = 1000)
    getName() String 스레드의 이름을 반환한다.
    setName(String name) void 스레드의 이름을 변경한다.
    start() void 스레드를 시작한다.
    getPriority() int 스레드의 우선순위를 반환한다.
    setPriority(int new Priority) void 스레드의 우선순위를 지정한다.
    join() void 현재 스레드는 join() 메서드를 호출한 스레드가 종료할 때까지 기다려야 한다.
    yield() static void 수행중인 스레드 중 우선순위가 같은 다른 스레드에게 제어권을 넘겨준다.
    currentThread() static Thread 현재 수행되는 스레드 객체를 리턴한다.

     Thread에서 주로 사용하는 메서드이다.

     

    이 중, 가장 대표적으로 종종 사용하는 것은 메서드 sleep이다.

    Thread.sleep(1000); - 입력 시, 1초간 동작을 멈춘다.

     

     

     

      Thread 사용 비교하기

     1. 평상시 사용방법

    기본적으로 쓰레드는 한개가 존재한다.

     평상시처럼 Java를 이용해서 for문을 동작시키면 위와 같은 결과가 나온다.

    첫 번째의 for문이 끝나기 전까지 두 번째의 for문은 동작하지 않는다.

     

     

     2. 스레드 사용방법

    쓰레드 활용시, 콘솔창은 위와 같이 출력된다.

    Thread의 기능을 활용하여, 각 Thread마다 for문 한 개씩 전달하였다. 콘솔 값은 놀랍게도 0과 1이 뒤섞인 모습을 알 수가 있다.

    실행된 Thread는 우선순위가 없으므로 실행되는 순서와 결과값은 실행 때마다 다르게 나타난다.

     

    그러나 알 수 있는 것은, 0을 500개, 1을 500개 출력하는 과정을 동시에 처리했다는 것을 알 수 있다.

     

     

     

      마무리

     Thread를 사용하는 것은 동시에 여러가지 작업을 진행하기 위함이다.

    그러나 이를 사용한다해서 시간소요가 줄어들지 않고 오히려 늘어난다.

    반응형

    댓글

    Designed by JB FACTORY