2013.10.14 15:27


java.lang.Tread 클래스


java.lang.Runnable 인터페이스


Thread 클래스를 상속 받는 경우

class 클래스명 extends Thread{

...

}


Runnable 인터페이스를 상속받는 경우 - 다른 클래스를 상속하여, Tread 클래스르를  상속받지 못하는 경우

class 클래스명 extends 수퍼클래스 implements Runnable{

...

}


Thread 클래스를 상속받아 스레드를 만드는 과정


1. Thread 클래스를 상속 받은 클래스를 선언

2. Thread 클래스의 추상 메소드인 run() 메소드를 재정의

class Threadtest extends Thread{ // Thread 클래스 상속

....;

public void run(){

....; // run 메소드의 재정의

}

}


3. main() 메소드에서 Thread 클래스를 상속 받은 클래스 객체를 생성

4. 생성된 객체를 사용해 start() 메소드 호출


public static void main(String[] args){

Threadtest obj = new Threadtest(); // 객체 생성

obj.start(); // start 메소드 호출

}


: 중요 메소드

public void start() :     스레드를 시작

public void run() :     스레드가 실행될 부분을 기술하는 메소드

Thread 클래스에 있는 run() 메소드에는 아무런 내용이 구현되어 있지 않고 상속 받은 클래스에서 재정의 해야 함


run() 대신 start()를 호출하는 이유

프로세스나 스레드가 실행된다는 의미는 CPU를 사용해 작업을 수행하는 것을 뜻한다. 그런데 한가지 작업만 처리하는 것이 아니고 동시에 2개 이상의 작업을 처리하는 멀티 프로세싱을 위해서는 CPU 스케쥴링이 필요하다. 운영체제는 CPU를 보다 호율적으로 사용하기 위해 작업의 우선 순위를 정해 처리한다. 결국 CPU의 사용권한을 정하는 것은 프로그램이 아니고 운영체제의 몫이다. start() 메소드는 스레드를 실행 가능한 상태, 즉 스레드가 CPU를 사용할 수 있는 준비 상태로 만드는 역할을 한다. 그리고 CPU 스케쥴링에 따라 run() 메소드를 호출해CPU를 사용하는 상태로 변한다.


Runnable 인터페이스

이미 다른 클래스를 상속 받아서 Thread 클래서를 상속 받을 수 없을 때 사용한다.


1. Runnable 인터페이스를 implements 하는 클래스 정의

2. Runnable 인터페이스의 run() 메소드를 재정의

3. main() 메소드에서 Runnable 인터페이스를 구현한 클래스 객체를 생성

4. Thread 클래스의 객체를 생성하면서, 3에서 만든 객체를 매개변수로 전달

5. 4.에서 생성한 Thread 클래스의 객체를 사용해서 start() 메소드를 호출


public static void main(String[] args){

RunnableTest obj = new RunnableTest();

Thread obj_t = new Thread(obj);

obj_t.start();

}


Thread의 우선순위 지정

여러 개의 스레드 중에 어떤 스레드가 CPU를 사용할지는 스레드 스케쥴러가 결정해서 처리하기 때문에 자바의 스레드의 정확한 동작은 예측하기 어렵다. 하지만 setPriority() 메소드를 이용해 우선순위를 부여할 수 있다.

대부분의 컴퓨터는 한 개의 CPU 만을 가지고 있기 때문에, 여러 스레드 중 하나의 스레드 만을 수행한다.

스레드가 작동하는 방식은 하나의 스레드가 종료될 때 까지 CPU를 독점하는 것이 아닌, 여러개의 스레드를 번갈아 가면서 처리하는 방식이다. 이처럼 여러 개의 스레드를 교차하면서 처리하는 것을 Scheduling 이라고 한다.

Posted by saudades

댓글을 달아 주세요