자바기초(쓰레드)

bitna's study note·2022년 5월 30일
0

자바

목록 보기
90/119

5월 30일 쓰레드 보충정리
출처는 남궁성 쌤의 '자바의 정석' 유튜브강의로 복습..

1.run()과 start()
일반 메서드 처럼 run()만 호출한다고 쓰레드 실행이 안됨
start() 메서드로 호출해줘야함

호출스택에서 start() 메서드가 호출되면 새로운 스택에서 run()메서드를 호출하고 start() 메서드는 사라지고 메인과 독립적인 스택에서 작업을 진행한다.

2.쓰레드는 '사용자 쓰레드'와 '데몬쓰레드(보조쓰레드)'가 있다.
실행중인 '사용자 쓰레드'가 하나도 없을때 프로그램은 종료된다.
즉 멀티 쓰레드 환경에서 main 쓰레드가 종료 되었다고 해서 프로그램이 종료되는것이 아니라 모든 쓰레드가 작업이 완료가 되었을때 프로그램이 종료된다.

3.쓰레드의 I/O블락킹

I/O블락킹이란 Input과 Output 입력시 작업을 일시중지된 상태
싱글쓰래드에서는 사용자로부터 입력을 기다리는 구간이 있을때 아무일도 하지 않지만 멀티쓰레드에서는 A쓰레드가 I/O블락킹상태라면
그동안 B쓰레드가 작업을 하여 효율적이게 쓴다.

4.데몬쓰레드
일반쓰레드를 도와주는 보조적인 역할을 한다. 일반쓰레드가 모두 종료되면 자동적으로 종료된다. 왜?? 보조해줄 쓰레드가 더이상 없기 때문에...
데몬쓰레드는 가비지 컬렉터나 자동저장등 메인쓰레드와 독립되어 메인쓰레드가 신경쓰지 못하는 부분을 독립적으로 작동하면서 중간중간처리해줌.

데몬쓰레드는 무한 루프로 설정후 if문안에 특정조건에 맞으면조건문을 실행하고, 중간중간 쉴수있게 sleep으로 잠재웠다가 메인쓰레드가 다 종료 될때까지 무한루프로 돈다.

5.쓰레드의 상태

쓰레드의 큰흐름은 생성->실행대기->실행->실행대기-> 실행과 실행대기를 반복하다가 작업이 끝나면 쓰레드가 소멸되거나 stop()메서드를 만나면 소멸됨

실행도중 쓰레드 쉼터로 들어갈수 있는데
sleep() 잠자기
join() 다른쓰레드 기다리기
I/O block 입출력대기
suspend()일시정지<->resume()재개
wait()기다리기 <->notify()
timeout()시간종료
interrupt()깨우기
yield()양보하기

등이 있어 쉼터에 머무르게 하거나 다시 실행대기 상태로 만들수 있다. 이것을 쓰레드의 실행제어로 조절이 가능하다.
여기서 sleep() 과 yield()는 static으로 되어 있는데, 쓰레드 자기자신에게만 호출이가능하다. 즉 자는것과 양보하는 거는 내가 나한테만 미치는 영향이라는 의미

6.sleep()
(1)static 매서드 이며, 자기자신한테만 동작함(다른쓰레드에 동작X), 현재 쓰레드를 지정된 시간동안 멈추게 한다.
(2)예외필수처리를 해주어야 한다. 왜냐? sleep()에는interruptedException이 발생하는데 Exception의자손이므로 꼭 예외처리를 해줘야한다.
interruptedException이 발생하면 작업재개한다.
(3)특정 쓰레드를 지정해서 멈추게 하는 것은 불가능하다.
sleep()은 내가 잠자는거지 남을 재울수 없음.

7.interrupt()
작업이 쉼터에 들어가 있는 쓰레드를 실행대기상태(Runnable)로 만든다.

8.suspend(),resume(), stop()
suspend()는 실행중이거나 실행대기상태(Runnable)인 쓰레드를 일시정지 시킨다.
resume()는 suspend()로 인해 일시정지된 쓰레드를 실행대기상태(Runnable)인상태로 만든다.
stop()은 쓰레드를 즉시 종료 시킨다.

suspend(),resume(), stop()는 dead-lock(교착상태)를 일으킬수 있으므로 사용하지않는것으로 권장함.

9.join()
지정된 시간동안 특정쓰레드가 작업되는 것을 기다린다.
예외 필수처리를 해야하며 interruptedException이 발생하면 작업재개

10.yield()
남은시간을 다음 쓰레드에게 양보하고,자신(현재쓰레드)은 실행대기한다.
static 매서드이며, 내가 양보하는거지 남에게 양보를 강요할수 없는것처럼
자기자신한테만 동작함(다른쓰레드에 동작X)
예를들어 suspend()일때 yield()를 사용하여 다음 쓰레드에게 시간을 양보한다.

profile
좋은개발자가 되기위한 삽질기록 노트

0개의 댓글

관련 채용 정보