<Thread>

쓰레드를 말하기 전에 프로세스에 대해서 알 필요가 있다.

프로세스란 무엇일까? 실행 중인 프로그램을 프로세스라고 한다. 프로세스는 프로그램을 수행하는데 필요한 데이터와 메모리 등의 자원 그리고 쓰레드로 구성되어 있다. 바로 이 쓰레드가 실제로 작업을 수행하는 것이다.

그러므로 프로세스 하나당 최소한 무조건 한개의 쓰레드가 존재하며 두개 이상 존재하는 경우를 멀티 쓰레드라고 한다.

우리가 지금 ctrl + alt + del를 눌러 작업관리자에서 프로세스란을 클릭하면 출력되는 것들이 프로세스이다. 이러한 프로세스에는 한개 혹은 여러개의 쓰레드들이 열심히 일을하며 움직이고 있을 것이다.

이 쓰레드라고 하는 것은 작업을 수행하는데 개별적인 메모리 공간을 필요로 하기 때문에 프로세스의 메모리 한계에 따라 생성할 수 있는 쓰레드의 수가 결정된다. 멀티태스킹은 이런 쓰레드를 한 프로세스에 여러개 만들어 동작하게 하는것이다. 하지만 CPU는 한 순간에 한 번의 동작밖에 할 수 없으므로, CPU는 아주 짧은(정말 미세한) 시간동안에 여러 작업을 번갈아가며 수행하는 것이다. 그래서 우리 눈에는 여러 개의 프로그램들이 동시에 돌아가는 현상을 볼 수 있는 것이다.

 

쓰레드를 구현하는 방법은 두가지가 있다.

첫번째는 Thread클래스를 상속받아서 사용하는 것.

두번째는 Runnable 인터페이스를 구현하는 것이다. (Runnable이 일반적인 방법)

 

1. Thread 클래스를 상속받는 방법

class MyThread extends Thread {

   public void run() {    // run()메소드를 오버라이딩

      // 내용

   }

}

 

<실습>

Thread 클래스를 상속받는 방법



다음 코드를 보면 MyThread1 클래스에 Thread 클래스를 상속받아 Thread클래스의 run()메소드를 오버라이딩 해서 사용하고 있다.MyThread 객체를 생성할 때 인자로 int형 정수와 String 문자열을 주었다. 각각의 쓰레드에서 첫 번째 쓰레드는 1~10까지 찍어내는 메소드를 수행하고, 두번째 쓰레드는 1~20까지 찍어애는 메소드를 수행한다. 이름도 각각 다르기 때문에 결과를 보면 다르게 나온다.

각각 두개의 쓰레드를 생성해서 각자 독립적으로 동작하는 것을 보여주었다.

물론 첫번째 쓰레드인 t1이 먼저 start()되었기 때문에 결과에 먼저 찍힌것이다.

첫번째 쓰레드가 끝나도 두번째 쓰레드는 계속 동작한다. 왜냐? 할 일이 남았기 때문에...

그런데 이상하지 않는가? run()메소드를 오버라이딩해서 왜 시작은 start()로 하는것인가?

이 문제는 다음 단락에서 확인하자.

 


-결과-


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

class MyThread implements Runnable {

    public void run() { // 작업 내용 }

}

 

<실습 - 2>

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



다음 코드를 보면 Runnable 인터페이스를 구현한 경우, Thread클래스를 상속받은 방법과 좀 다르다는 것을 알 수 있다.
먼저, Runnable 인터페이스를 구현한 클래스(위에서는 MyThread2)의 인스턴스를 생성한 후, Thread클래스의 인스턴스를 생성할 때 생성자의 매개변수로 제공해야 한다.
이때 사용되는 Thread의 생성자는 Thread(Runnable target)이다.
 
-결과-



<run()메소드, start()메소드>

쓰레드를 실행 시킬때 run()이 아닌 start()를 호출했다는게 의문이 들것이다. run()메소드는 어렵게 생각하지 말고 단순히 클래스에 오버라이딩 된 메소드를 호출해서 사용하는 것으로 생각하면 된다.

start()메소드는 새로운 쓰레드가 작업을 실행하는데 필요한 호출스택(공간)을 생성한 다음 run()을 호출해서 그 안(스택)에 run()이 저장되는 것이다.

즉, 쓰레드를 사용하기 위해 start()를 실행시키는 순간 쓰레드만의 독립적인 작업 공간인 호출스택이 만들어지는 것이다. 그 후에 호출 스택안에 각 실행하고자 하는 예를 들면 run()과 같은 메소드들이 저장되는 것이다.

호출 스택에 있는 내용들이 모두 수행하고 나면 쓰레드는 호출스택 공간과 함께 메모리 상에서 소멸된다.



'Programming > Java' 카테고리의 다른 글

Java - FileInputStream, FileOutputStream  (0) 2015.12.08
Java - InputStream, OutputStream  (0) 2015.12.08
Java - 예외 처리 (Exception)  (0) 2015.12.08
Java - Hashtable, HashMap  (0) 2015.12.08
Java - Iterator  (0) 2015.12.08
posted by 경원구