본문 바로가기

자바공부

자바 스레드만들기, 명품자바프로그래밍13장

728x90
반응형

* 자바 스레드를 만들기 위해 개발자는 두 가지 작업을 해야한다.

1) 스레드 코드 작성

2) JVM에게 스레드를 생성하여 스레드 코드를 실행하도록 요청

 

* 자바 스레드를 만드는 방법 2가지

1) Thread 클래스 이용

2) Runnable 인터페이스 이용

 

* Thread 클래스의 경로명은 java.lang.Thread이다.

Thread 클래스는 스레드를 만들고 유지 관리하기 위해 많은 메소드를 제공

Thread의 메소드 내용
Thread()
Thread(Runnable target)
Thread(String name)
Thread(Runnable target, String name)
단순한 스레드 객체 생성
Runnable 객체인 target을 이용하여 스레드 객체 생성
이름이 name인 스레드 객체 생성
Runnable 객체를 이용하며, 이름이 name인 스레드 객체 생성
void run() 스레드 코드로서 JVM에 의해 호출된다.
개발자는 반드시 오버라이딩하여 스레드 코드를 작성하여야 한다.
이 메소드가 종료되면 스레드도 종료
void start() JVM에게 슬레드 실행을 시작하도록 요청
void interrupt() 스레드 강제 종료
static void yield() 다른 스레드에게 실행을 양보한다.
이때 스레드 스케줄링이 시행되며 다른 스레드를 선택하여 실행시킨다.
void join() 스레드가 종료할 때까지 기다린다.
long getId() 스레드의 ID 값 리턴
String getName() 스레드의 이름 리턴
int getPriority() 스레드의 우선순위 값 리턴
void setPriority(int n) 스레드의 우선순위 값을 n으로 변경
Thread.State getState() 스레드의 상태 값 리턴
static void sleep(long mills) 스레드는 mills 시간 동안 잔다. mills의 단위는 밀리초
static Thread currentThread() 현재 실행 중인 스레드 객체의 레퍼런스 리턴

 

* 스레드를 생성하는 데 필요한 총 4개의 과정

1) 스레드 클래스 작성 : Thread 클래스 상속

먼저 Thread 클래스를 상속받아 TimerThread 클래스를 작성한다.

class TimerThread extedns Thread{ // Thread 상속받음
	.............................................
}

 

2) 스레드 코드 작성 : run() 메소드 오버라이딩

Thread의 run() 메소드를 오버라이딩한다.

run()를 스레드 코드라고 부른다.

스레드는 run() 메소드로부터 실행을 시작하고 run()이 종료하면 스레드도 종료한다.

class TimerThread extedns Thread{ // Thread 상속받음
	.............................................
    public void run(){ // run() 오버라이딩
    	.............................................
    }
}

만일 run()을 오버라이딩하지 않으면 Thread 클래스의 run()이 실행되며, Thread의 run()은 아무 일도 하지 않고 단순 리턴하도록 작성되어 있어 스레드가 바로 종료된다.

 

3) 스레드 객체 생성

TimerThread th = new TimerThread(); // 스레드 객체 생성

스레드 객체를 생성한 것으로 스레드가 작동하는 것은 아니다.

스레드 객체의 생성은 어디까지나 하나의 객체 생성에 불과하다.

스레드는 다른 객체와 달리 JVM에 등록되어 JVM에 의해 스케줄링되어야 비로소 작동된다.

 

4) 스레드 시작 : start() 메소드 호출

스레드 생성의 가장 중요한 마지막 과정은 스레드가 생명력을 가지고 실행을 시작하도록 하는 것이다.

Thread 클래스의 start() 메소드를 호출하여 스레드를 동작시킨다.

th.start();

 

* start() 메소드는 Thread 클래스에 구현된 메소드이며 개발자가 오버라이딩하면 안 된다.

start() 메소드는 생성된 스레드 객체를 스케줄링이 가능한 상태로 전환하도록 JVM에게 지시한다.

이후 스케줄링에 의해 이 스레드가 선택되면 비로서 JVM에 의해 run()메소드가 호출되어 실행을 시작한다.

 

* TimerThread는 Thread를 상속받은 클래스로서 run()을 오버라이딩하여 스레드 코드를 구현한다.

run() 메소드는 무한 루프를 돌면서 1초 간격으로 콘솔에 초 시간을 출력한다.

 

* sleep(1000); 코드는 TimerThread 자신이 1000ms 동안 잠을 자는 코드이다.

잠을 자는 사이에 이 스레드를 종료시키고자 하는 예외 InterruptedException이 발생하였을 때 이를 처리하기 위해 try-catch 블록이 삽입되었다.

 

* catch 블록은 return 뿐이므로 Interrupted Exception이 발생하면 run() 메소드가 종료하게 되어 스레드는 바로 종료한다.

만일 try-catch 블록 없이 sleep() 문을 사용하면 자바 컴파일러는 오류를 발생시킨다.

 

Thread를 상속받아 1초 단위로 초 시간을 출력하는 TimerThread 스레드 작성

반응형