JAVA,객체지향

스레드란?

25G 2021. 12. 1. 10:19

스레드는 빛처럼 빠른 홀서빙 아르바이트생 같은 것이다. 이 아르바이트생은 너무나 빨라서 음식을 나르고, 반찬을 담고, 인사를 하는 이 여러 가지에 일이 동시에 일어나는 것처럼 보일 정도이다. 이렇게 하면 한 명의 빛처럼 빠른 아르바이트생이 여러 가지 일을 하지만 보는 사람으로 하여금 동시에 여러 명이 위에 일을 처리하는 것처럼 보이는 것이다.

근데 이 알바생이 고민이 있다. 자신이 빠르기는 한데 김치를 담다가 손님이 와서 인사와 김치 담기를 동시에 하는데 "안"까지 말하고 다시 반찬 담는 곳에 와서 김치를 담다가 다시 돌아가서 "녕"을 말해야 하는데 이 아르바이트생이 어디까지 인사말을 했는지 까먹은 것이다. 그래서 몇 번의 실수 끝에 이 아르바이트생이 고안한 방법이 있다.

Context(문맥=전후 시점) 체크를 하기 시작한 것이다.

 

스레드는 어떤 하나의 CPU가 동시에 두 가지 이상의 일을 왔다 갔다를 굉장히 빠르게 해서 인간의 눈과 체감엔 마치 동시에 일어난 것처럼 보이도록 하는 것을 스레드라고 한다. 이를 멀티 스레드라고 한다.

 

기본적으로 자바는 최초에 스레드를 메인스레드 하나만 들고 있다.

java의 메인스레드

위와 같이 해보면 스레드가 1초에 한번씩 자다가 일어나서 명령을 수행해 준다. 메인 메서드는 main함수가 끝날 때 같이 자신의 일이 종료된다. 그렇다면 위에서 얘기한 멀티 스레드는 어떻게 사용할까?


 

위와 같은 상황에서 SubThread의 부모는 Runnable인 상황에서 SubThread타입의 st객체를 만들었을 때(new) 메모리 상황은

-Runnable

-SubThread  <-SubThread타입이기 때문에 바라보는 것은 SubThread를 바라보고 있다.

위와 같이 두 개가 메모리에 뜰 것이다. 그리고 위 코드에서 처럼 SubThread가 Runnable의 함수를 오버 라이딩함으로 인해서 동적 바인딩이 됐고 현제 부모의 run메서드는 무효화된 상태이다.

 

Thread의 객체가 만들어질 때 스레드를 하나 만들어준다. 그럼 이 Thread클래스를 Ctrl+우클릭해서 들어가 보면 

다음과 같은 생성자를 볼 수 있다.

생성자의 매개변수로 Runnable타입의 target객체를 넣어준다면 스레드를 하나 더 만들어 주겠다고 돼 있다.

그럼 위에서 만든 st객체(SubThread의 객체)는 SubThread이기도 하지만 Runnable이기도 하기 때문에(다형성) 해당 객체를 넣어주면 위 생성자가 때려지게 된다.

그래서 다음과 같이

st객체를 매개변수로 넣어주게 되면 위 생성자의 target설정이 끝났기 때문에 t1을 사용하면 run메서드를 실행시킬 수 있다.

 

위와 같이 되면 스레드가 위에서 얘기한 빛처럼 빠른 아르바이트생처럼 왔다 갔다 하면서 명령어를 실행시켜 나간다.

그래서 따로 실행시키는 것처럼 보이지만 사람이 눈치 챌 수 없을 정도로 빠르게 왔다 갔다 하며 일을 실행시켜 나가는 것이다.

이렇게 됐을 때

장점은 동시에 실행시키는 것처럼 눈속임이 가능해지지만

단점은 힘들다. 즉 컴퓨터에 부하가 많이가고 컴퓨터 자체적인 퍼포먼스가 중요해진다.

스레드가 왔다 갔다 하는 것을 용어로 Context swich(콘텍스트 전환)라고 한다.

그럼 위 코드를 실행 시켜보면 두가지의 메서드가 마치 동시에 일을 하는것 처럼 실행 된다.

 

정리

1. Thread 객체를 만들자

2. Thread 객체의 target을 만들자 (Runnable타입)

 

'JAVA,객체지향' 카테고리의 다른 글

String Constant Pool  (2) 2021.12.02
예외처리란?  (0) 2021.12.01
제네릭이란?(와일드카드)  (0) 2021.11.28
SRP와 DIP  (0) 2021.11.26
추상클래스와 인터페이스의 차이  (0) 2021.11.26