본문 바로가기
Java (국비)/Java 이론

스레드 (Thread) 간단 정리

by Hwanii_ 2023. 5. 22.
728x90

Thread : 메모리를 할당받은 프로세스에서 실질적인 작업을 수행하는 주체.

 

Process : "실행중인 프로그램" 을 의미.

 

Thread의 특징 : 

"독립적"으로 일을 수행.

(스레드 객체들은 독립적으로 일을 수행 하고 있음을 이해 해야 한다)

=> A 객체가 있고, B 객체가 있으면, A 객체가 끝나고 B 객체가 실행되는게 아니라 !

A 객체를 실행시키고 곧바로 B 객체도 실행을 동시에 진행 !

 

프로세스가 실행되는 방식 :

1. 선점형 방식

우선순위 순서대로 자원(메모리)을 할당 받아 진행되는 방식.

단점 - 기아현상이 발생될 가능성이 있음.

기아현상 - 자원을 할당받지 못함을 의미한다.

why ? - 우선 순위에서 계속 계속 밀려버리면 실행이 안되기 때문이다.

 

2. 시간분할 방식

시간을 동일하게 배분하여 골고루 실행될 수 있도록 진행되는 방식.

장점 - 기존의 선점형 방식에서 우선 순위가 낮아 오~~~래 기다린 프로세스에게 우선순위를 높여준다.

(우선 순위가 낮아서 계속 대기하다가,, 어 얘 오래 기다렸네 ? 하고 우선 순위를 높여줘서 실행되게 하는 것이다)

 

OS(운영체제)의 '스케줄러' 가 담당한다.

 

정리 : 

스레드 == 메모리를 할당받은 프로세스에서 실질적인 작업을 수행하는 주체.

프로세스 == "실행중인 프로그램" 을 의미.

 

참고 1 : 

이클립스 아이콘을 더블클릭 - 실행상태 => 프로세스.

(일 (동작) 을 할 수 있게 메모리(자원)을 할당 받은 상태)

 

참고 2  :

자바는 거의 왠만한걸 다 만들어둬서 별도로 무언가를 선언하지 않고, 바로 스레드를 사용할 수 있다.

 

이클립스에서 구현하기

 

개념 : 

 

// 이미 JAVA에서 구현한 Thread 클래스를 가져다가 사용할 수 있다.

// 즉, 코드를 재사용한다.

// 클래스가 이미 구현되어 있으니까 extends (상속)을 받아서 사용.

 

// 스레드 생명주기 (라이프 사이클)

// 생성 -> 대기 -> 수행 -> 데드

// 블록 : 자원(메모리) 을 할당 받지 못하도록 막아 놓은 상태.

(스레드 중간에 블록을 걸 수 있다)

 

생성 : 객체를 생성 하면 생성 된다.

 

대기 : 생성이 되면 즉시, 대기 상태가 된다.

 

(언제까지 ? 수행하기 전까지 ~)

 

수행 : 참조변수.start() 메서드를 사용해서 

스레드 객체를 일하라고 명령을 내린다.

start() 메서드를 호출하면 내부의 run() 메서드를 수행하게 된다.

 

데드 : 주어진 run()을 다 수행하게 되면, 데드 상태가 된다.

 

1. class Th01은 Thread 클래스를 상속 받은 상태.

2. run() 메서드는 Thread 클래스에 존재하는 메서드 이다.

이것을 하위클래스인 Th01 클래스에서 사용하기 위해 오버라이딩을 한 상태.

 

1. class Th02은 Thread 클래스를 상속 받은 상태.

2. run() 메서드는 Thread 클래스에 존재하는 메서드 이다.

이것을 하위클래스인 Th02 클래스에서 사용하기 위해 오버라이딩을 한 상태.

 

1. main() 에서 Th01 클래스와 Th02 클래스의 객체를 생성 해준다.

2. 참조변수.start(); 로 각각의 스레드를 상속받은 클래스의 객체들이 run() 메서드를 실행 한다.

 

Console

콘솔창을 확인해보면, 실행이 순서대로 되는 개념이 아닌것을 확인 할 수 있다.

 

++

 

 

sysout(i) 와

Thread.sleep(1500) 을 10번 반복 하는데,

 

한번 i를 출력하고, 1.5초 일시정지 후에

i+1 출력하고 또 1.5초 일시정지 후에

i+2 출력하고 또 1.5초 일시정지 후에

...

 

블록 : 자원(메모리)을 할당받지 못하도록 막아 놓은 상태.

 

=> sleep을 해서  일시적으로 메모리 할당을 막음.

반응형