Thread와 Runnable 의 차이

현이·2022년 9월 22일
0

면접

목록 보기
1/2

우선 Thread의 특징 3가지입니다.

  1. 쓰레드 프로그램은 객체지향과 거리가 멀다.
  2. 객체지향 프로그램을 설계한 후 쓰레드를 만든다
  3. 람다방식으로 만들 수 있다.

Thread 와 Runnable의 사용용도

우선, 실행흐름을 실이라고 생각해봐요

쓰레드는, class로써 객체하나당 실 한개를 사용할때 씁니다.

예를들어, 경마게임을 만든다고 했을때, 여러마리의 말이 필요하고, 여러마리의 말이 달리죠?
이말은 즉, 여러개의 말 인스턴스가 필요하다는 이야기가 됨으로, 이런 경우에는 Thread를 사용해야 합니다.

그리고,

요청은 받는 Server 프로그램을 만든다고 했을때, 서버는 하나가 존재하지만,
여러 요청을 응답해주어야 하기 때문에 이런경우에 Runnable interface를 구현해서 사용하면 되요.

언제 Thread를 사용하고, 언제 Runnable을 사용하는가?

즉,

  1. thread 는 객체하나당 실 한개를 사용할때 사용한다.
  2. runnable 는 객체는 하나인데 실이 여러개 필요할때 사용한다.

정도로 이해하면 될 듯 해요.

Thread class도, Runnable interface도 결국 둘다 Thread(실행단위?흐름?) 입니다.

이 쓰레드(실행흐름단위)는 여러개의 루프를 동시에 돌리고 싶을때 사용해요.

하지만, 쓰레드는 동시에 접근하기 때문에 공유자원을 사용할때 문제가 생깁니다.

왜 문제가 되냐?

이런 코드가 있어요

class Test extends Thread {
	private Connection conn;
    
    public static void main(String[] args) {
    		Test t1 = new Test();
            Test t2 = new Test();
            
            t1.start();
            t2.start();
    	}
        
    @Override
    public void run() {
    	conn.close();
    }
}

t1 인스턴스는 a connection을 가지고있고,
t2 인스턴스는 b connection을 가지고 있다고 했을때,

t1, t2는 동시에 Test 객체의 필드를 공유하기때문에

t1은 a connection을 가지고있다고 생각해서 로직이 끝난 뒤, 자원반납을 했는데
b connection이 들어있어서 b connection에 대한 자원을 반납하게 되고,

a connection의 자원은 반납되지 못한채 무한정 연결상태를 유지하며 결국 db가 다운되고마는 일이 발생할 수가 있어요.

이처럼 공유자원을 사용하는 경우에는 Thread-safe한 환경을 만들어서 사용해야 합니다.

DAO 만들때 connection, preparedStatement, ResultSet은 지역변수로 만들어라. 처럼이요.

profile
의미있는 고찰

0개의 댓글