본문 바로가기
자바/자바 NIO

스레드 구현(추가)과 실행

by saul 2022. 7. 10.

- 스레드 구현과 실행

 

스레드를 구현하는 방법은 Thread 클래스를 상속받는 방법과 Runnable 인터페이스를 구현하는 방법이 있다. 첫 번째에서 말했듯이 Runnable 인터페이스를 구현하는 것이 일반적이다.

 

Runnable 인터페이스를 구현하는 방법은 코드의 재사용성이 높고 코드의 일관성(consistency)을 유지할 수 있기 때문에 보다 객체지향적인 방법이라고 할 수 있다.

다행히 run() 메서드만 구현하면 된다 ^^;

 

 

 

- 상속과 구현에 따른 메소드 호출 차이

 

Thread 클래스를 직접적으로 상속 받았을 경우
Runnable 인터페이스를 상속받은 경우

Thread 클래스를 상속받으면, 자손 클래스에서 조상인 Thread클래스의 메서드를 직접 호출할 수 있지만, Runnable을 구현하면 Thraed클래스의 static 메서드인 currentThread() 를 호출하여 스레드에 대한 참조를 얻어 와야만 호출이 가능하다.

 

상속의 경우 상위 클래스로부터 상위 클래스의 메서드들을 직접 호출할 수 있다. (private 접근제어자인 경우 제외)

Runnable 인터페이스 사용시 Thread 클래스를 상속받지 않았기 때문에 직접적으로 호출할 수 있는 방법은 없다. 따라서 Thraed 클래스의 static 메소드들을 사용한다.

 

Thread 클래스를 상속받으면, 자손 클래스에서 조상인 Thread클래스의 메서드를 직접 호출할 수 있지만, Runnable을 구현하면 Thraed클래스의 static 메서드인 currentThread() 를 호출하여 스레드에 대한 참조를 얻어 와야만 호출이 가능하다.

 

상속의 경우 상위 클래스로부터 상위 클래스의 메서드들을 직접 호출할 수 있다. (private 접근제어자인 경우 제외)

Runnable 인터페이스 사용시 Thread 클래스를 상속받지 않았기 때문에 직접적으로 호출할 수 있는 방법은 없다. 따라서 Thraed 클래스의 static 메소드들을 사용한다.

코드를 보면 currentThread() 는 Thread 객체를 리턴한다.

그래서 스레드 객체. getName()을 사용할 수 있는 것이다.

만약 바로 getName을 사용하지 않고 currentThread()를 사용한다면 어떻게 나올까?

당연히 toString()에 입력되어 있는 상태로 나올 것이다.

Thread 클래스의 toString을 보면 스레드에 그룹이 있다면 그룹 명도 같이 써주라고 나와있다.

기본적으로 그룹을 지정해주지 않는 이상 main 그룹이기 때문에 main 그룹으로 출력된다.

스레드를 생성했다고 해서 자동으로 실행되는 것은 아니다. start()를 호출해야만 스레드가 실행된다.

메인 메서드 내부에서 스레드를 시작하게 하였다.

 

start() 메서드가 실행된다고 해서 스레드는 바로 실행되지 않는다. 실행 대기 상태에 있다가 자신의 차례가 되어야 실행된다. 실행대기중이 스레드가 하나도 없으면 바로 실행 상태가 된다.

 

또한 스레드들이 종료하는 시기도 제각각이다. 가장 먼저 실행되었다고 가장 먼저 종료되지는 않는다.

 

 

- 종료된 스레드 재 호출 방법

 

종료된 스레드는 다시 실행할 수 없다. 이는 새롭게 스레드 객체를 만들어 줘야 한다는 말이다.

또한 하나의 스레드 객체에 하나의 start() 메서드를 호출할 수 있다는 뜻이다.

하나의 스레드 객체에서 start() 메서드를 두 번 호출해보았다.

두 번째 start() 가 실행되지 않고 IllegalThraedStateException예외가 발생했다. 또한 메인 스레드 실행 중 start() 메서드에서 예외가 나왔기 때문에 메인 스레드도 다 끝내지 못했다.  

 

 

 

 

 

 

참고 : 

김성박, 송지훈 『자바 I/O&NIO 네트워크 프로그래밍

『JAVA의 정석』 스레드 파트

'자바 > 자바 NIO' 카테고리의 다른 글

스레드의 구현, 멀티 스레드의 장점과 단점  (0) 2022.07.10
TCP프로토콜과 소켓, 포트  (4) 2022.06.30
기초 네트워크  (2) 2022.06.29