๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿš— Major Study (Bachelor)/๐ŸŸ  JAVA Programming

JAVA ํ”„๋กœ๊ทธ๋ž˜๋ฐ 16์žฅ Thread

by UKHYUN22 2021. 12. 12.
728x90

 

Thread
concurrent ๋ฅผ multithread ๋ผ๊ณ  ํ‘œํ˜„ํ•œ๋‹ค. Thread ๋ผ๋Š” ๊ฒƒ์€ squencial ํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ๋งํ•œ๋‹ค.
๋…ผ๋ฆฌ์ ์œผ๋กœ ํ•˜๋‚˜์˜ flow ํ•˜๋‚˜์˜ task๋งŒ ์ง„ํ–‰์ด ๋œ๋‹ค ์ฆ‰ single threaded program์ด๋ผ๊ณ  ํ•œ๋‹ค.
multithreaded program์ด๋ผ๊ณ  ํ•˜๋ฉด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…ผ๋ฆฌ์  flow๊ฐ€ ์ง„ํ–‰๋˜๋Š” ์ƒํ™ฉ์„ ์–˜๊ธฐํ•œ๋‹ค.
ํ”„๋กœ๊ทธ๋žจ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋„์ค‘ ์—ฌ๋Ÿฌ ๊ฐœ์˜ task๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ์–˜๊ธฐํ•œ๋‹ค.
CPU ์ฐจ์›์—์„œ ๋ดค์„ ๋•Œ๋Š” ํ•˜๋‚˜๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด์ง€๋งŒ OS ์ฐจ์›์—์„œ ๋ดค์„ ๋•Œ๋Š” Multi

 

 


Reactive system์ธ ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ ๊ฐœ์˜ system์„ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•  ์ˆ˜ ์žˆ๋Š” ์„ผ์„œ๋งˆ๋‹ค ์ „๋‹ดํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ๋“ค์ด ์กด์žฌ.
์˜ˆ๋ฅผ ๋“ค์–ด ์„ผ์„œ๊ฐ€ 10๊ฐœ๊ฐ€ ์žˆ๋‹คํ•˜๋ฉด ์„ผ์„œ 10๊ฐœ๋ฅผ ํ•œ ์‚ฌ๋žŒ์ด ๊ด€์ฐฐ์„ ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ํ•˜๋‚˜์”ฉ ์ญ‰ ๊ด€์ฐฐ์„ ํ•˜๊ฒŒ ๋œ๋‹ค.
๋งŒ์•ฝ ๊ด€์ฐฐ์„ ํ•˜๊ณ  ๋„˜์–ด๊ฐ”๋Š”๋ฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”๋ฐ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ sequential ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜์‘์ด ๋Šฆ๋‹ค.
ํ•˜์ง€๋งŒ ์ธ๋‹น ํ•˜๋‚˜์˜ task๋ฅผ ๋ณธ๋‹ค๋ฉด ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ฐ˜์‘์ ์ธ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

Disadvantage
๊ฐ๊ฐ์˜ Thread๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ๋Œ์•„๊ฐ€์•ผ ํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ˆœ์„œ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด ๊ทธ ์ˆœ์„œ๋ฅผ Control ํ•ด์•ผ ํ•œ๋‹ค.
์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•ด์•ผ ํ•œ๋‹ค. ์ž„์˜๋กœ ์ด๋ฃจ์–ด์งˆ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ ์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค.
Interation๊ณผ Cooperation์„ ๊ฐ€์ง€๊ณ  ์ˆœ์„œ์„ฑ, ์ƒํ˜ธ ์ž‘์šฉ์„ ํ•˜๋ฉด์„œ ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์žกํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์ง€์›๋˜์–ด์•ผ ํ•œ๋‹ค.
์•ˆ์ „์„ฑ ๋ฌธ์ œ(safety Problem)
-> ์€ํ–‰๊ณ„์ขŒ์— ๋‘ ์‚ฌ๋žŒ์ด ๋™์‹œ์— 100๋งŒ์›์„ ์ธ์ถœํ•˜๋ฉด 200๋งŒ์›์„ ์ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?
Liveness ๋ฌธ์ œ
-> ๋‚˜๋Š” ๋„ˆ๋ฅผ ์›ํ•˜๊ณ  ๋„ˆ๋Š” ๋‚˜๋ฅผ ์›ํ•˜๊ณ , ์„œ๋กœ์˜ ์กฐ๊ฑด์ด ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ (์•„๋ฌด๊ฒƒ๋„ ์ผ์–ด๋‚  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ)

 

 


Thread / Processes
Process ๊ฐœ๋…
concurrent ๋‘ ๊ฐœ์˜ task๊ฐ€ ๋™์‹œ์— ์ง„ํ–‰๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.
heavyweight ๋ฌด๊ฒ๋‹ค. 
OS์— ์˜ํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ task๊ฐ€ ๋™์‹œ์— ์ง„ํ–‰๋œ๋‹ค. OS์— ์˜ํ•œ ์ฒ˜๋ฆฌ๋Š” ๋ณ„๋„์˜ ํ”„๋กœ๊ทธ๋žจ.. ์Œ์•…ํ‹€๊ณ , ์›นํ‹€๊ณ ,,์œ ํŠœ๋ธŒ ํ‹€๊ณ  ๋“ฑ๋“ฑ
๊ทธ ํ”„๋กœ๊ทธ๋žจ๋“ค ๋ผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•  ํ•„์š”๋Š” ์—†๋‹ค. ๊ฐ๊ฐ์˜ ํ”„๋กœ๊ทธ๋žจ์ด OS์—์„œ ๋”ฐ๋กœ ๋Œ์•„๊ฐ€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ
๊ณต์œ ์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด Process ์—์„œ ์ € process๋กœ pipe๋ฅผ ํ†ตํ•ด์„œ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ์ •๋„์˜ ๊ณต์œ ๋Š” ํ•  ์ˆ˜ ์žˆ๋‹ค.
Thread
Java Virtual Machine์—์„œ ๋ดค์„ ๋•Œ ๋‘ ๊ฐœ์˜ task๊ฐ€ ๋™์‹œ์— ์ด๋ฃจ์–ด์ง€๋Š” ๊ฒƒ
JVM์ด ๊ด€๋ฆฌ๋ฅผ ํ•˜๊ณ , ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ์„ ํ•˜๋Š” ์‚ฌ๋žŒ์ด ๋‘ ๊ฐœ์˜ Task๊ฐ€ ๊ณต์œ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‘๋Š” ๊ฒƒ.
ํฌ๊ฒŒ ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ ์•ˆ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ task๊ฐ€ ์ด๋ฃจ์–ด์ง€๋ฉฐ ๊ณต์šฉ์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์กด์žฌํ•œ๋‹ค.
๋ณ€์ˆ˜๋ฅผ ๊ณต์œ ํ•˜๊ฑฐ๋‚˜ Object๋ฅผ ๊ณต์œ ํ•˜๋„๋ก Support ํ•˜๋Š” ๊ฒƒ.
๊ทธ๋Ÿฌ๋ฏ€๋กœ Process๋ณด๋‹ค Resource๋ฅผ ์ ๊ฒŒ ๋จน๋Š”๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ Lightweight ๋ผ๋Š” ๊ฒƒ

 


Window ์ž‘์—… ๊ด€๋ฆฌ์ž
ํ”„๋กœ์„ธ์Šค ๋ฉ”๋‰ด

 

 


Thread / Process
๋ฉ”๋ชจ๋ฆฌ ๊ด€์ 
Process๋Š” ๋ณ„๋„์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์—์„œ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ

Thread๋Š” ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ ์•ˆ์—์„œ ์ž‘๋™ํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ Task
Main Routine๊ด€์ 
Process๋Š” ๊ฐ๊ฐ ๋ณ„๋„์˜ main์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ 

Thread๋Š” ํ•˜๋‚˜์˜ Main์—์„œ subroutine์ด ์กด์žฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค.

 

 


Creation of Threads
Thread๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๊ฑฐ๋‚˜ Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ Implements ํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

 

 


Extending the Thread Class 
run์ด๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ overrideํ•ด์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. 

 


To start a new thread
Instance๋ฅผ ๋งŒ๋“ค๊ณ  start๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. new MyTHread.start()๋กœ ์‹œ์ž‘

 


Simple counter
run์— ํ•ด๋‹นํ•˜๋Š” ๊ฒƒ์ด ๋กœ์ง์ด๋‹ค. for(;;) ๋ฌดํ•œ๋ฃจํ”„ InterruptedException์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค.
์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ณ„์†์ ์œผ๋กœ count๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ์ค€๋‹ค. sleepํ•˜๋Š” ์‹œ๊ฐ„์— ์ง„์งœ ์ž๋‹ค๊ฐ€ ์ผ์–ด๋‚˜์„œ ์ถœ๋ ฅํ•˜๊ณ  ๋”ํ•˜๊ณ ๋ฅผ ๋ฐ˜๋ณตํ•œ๋‹ค. Counter(0,1,33).start()๋กœ ์„ ์–ธํ•œ๋‹ค.  0์—์„œ 1์”ฉ ์ฆ๊ฐ€ํ•˜๋Š”๋ฐ 0.033 ์ดˆ์— ํ•ด๋‹นํ•˜๋Š” delay๋ฅผ ์ค€๋‹ค. ๋‘ ๊ฐœ์˜ Thread๊ฐ€ ๋™์‹œ์— ์ˆ˜ํ–‰๋œ๋‹ค. ์ด ๊ฒฐ๊ณผ๋ฅผ ํ™”๋ฉด์„ ํ†ตํ•ด์„œ ๋ณด์—ฌ์ฃผ๊ฒŒ ๋œ๋‹ค.

 

 


3๋ฐฐ ์ •๋„ ๋Šฆ์€ ์†๋„๋กœ -1 ๋˜๋Š” ๊ฒƒ๋“ค์ด ์ถœ๋ ฅ๋œ๋‹ค. ๋‘ ๊ฐœ์˜ task๊ฐ€ ๋™์‹œ์— ์ง„ํ–‰๋œ๋‹ค. main ํ”„๋กœ๊ทธ๋žจ์€ ๋๋‚˜๊ฒŒ ๋˜๊ณ  concurrentํ•˜๊ณ  independentํ•˜๊ฒŒ ์ˆ˜ํ–‰๋œ๋‹ค.

 

 


Runable interface๋ฅผ implements ํ•˜๋Š” ๊ฒƒ
Thread๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค๋ผ๋Š” ๊ฒƒ.

 


Runable Interface์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ run์ด๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค. ๋‹ค๋ฅธ ํด๋ž˜์Šฌ extends ํ•  ๋•Œ๋Š” Implements ํ•  ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.

 


new Thread(new MyThread()).start() 
์•ฝ๊ฐ„์˜ ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฅธ๋‹ค.

 

 


๋™์ผํ•˜๊ฒŒ ๋Œ์•„๊ฐ€๋Š” ํ”„๋กœ๊ทธ๋žจ ํ•˜์ง€๋งŒ Runnable์„ Implements ํ•œ๋‹ค. ์ด๋ฒˆ์—๋Š” Thread.sleep์ด๋ ‡๊ฒŒ ์„ ์–ธ์„ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  start ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์ด ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ์œ ๋…ํ•˜๋ผ๊ณ  ํ•˜์…จ์Œ!

 

 


Controlling Threads
State ๊ฐœ๋…. ์–ด๋–ค ์ƒํƒœ์— ์žˆ๋Š๋ƒ. sleep์˜ ์ƒํƒœ์— ์žˆ๋‹ค๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ƒํƒœ๋“ฑ state๋ฅผ ํŒŒ์•…ํ•ด์•ผ ํ•œ๋‹ค.
state๋ฅผ Control ํ•˜๋Š” ๊ฒƒ๊ณผ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฒƒ๋„ ์žˆ์ง€๋งŒ ์ด๋Š” ๋‹ค๋ฃจ์ง€ ์•Š๊ฒ ๋‹ค.

 

 


New ์ƒํƒœ Alive ์ƒํƒœ Dead ์ƒํƒœ
Runnable์€ ์‹ค์ œ๋กœ ํ”„๋กœ๊ทธ๋žจ์ด ์ˆ˜ํ–‰๋˜๋Š” ์ƒํƒœ์ด๊ณ  

Blocked๋Š” ๊ฒจ์šธ์ž , ๋™๋ฉด์˜ ์ƒํƒœ๋ฅผ ๋งํ•œ๋‹ค.

Sleeping ์ƒํƒœ๊ฐ€ ํฐ ์˜๋ฏธ๋กœ Blocked ์ƒํƒœ๋ฅผ ๋งํ•œ๋‹ค. Thread ํ•˜๋‚˜๋ฅผ Blocked ์ƒํƒœ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์‚ฌ์šฉ์ž๊ฐ€ sleep์ด๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ•˜๊ณ  Runnable ์ƒํƒœ๋กœ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด์„œ start ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 


wait, notify, notifyAll ์˜ ๋ฉ”์†Œ๋“œ๋„ ์žˆ๋‹ค!!

 

 

 


์—ฌ๋Ÿฌ ๋ฉ”์†Œ๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค!!

 


Thread Priority and Scheduling
์šฐ์„  ์ˆœ์œ„๋ฅผ ์คŒ์œผ๋กœ Control ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 


Thread๊ฐ€ Control์„ ๋บ๊ธฐ๋Š” ์ƒํƒœ๋Š” sleep, join, wait์ด๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋–„.
time-slice ์—ฌ๋Ÿฌ ์ˆ˜ํ–‰ ๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ๋“ค์„ ์‹œ๊ฐ„์„ ํ• ๋‹นํ•œ๋‹ค. 

 


Safety and Liveness
safe ํ•˜๋‹ค๋Š” ๊ฒƒ์€ ์ผ์–ด๋‚  ์ผ์ด ์ผ์–ด๋‚˜์„œ๋Š” ์•ˆ๋€๋‹ค. ์˜ˆ๊ธˆ์€ 100๋งŒ์›์ธ๋ฐ 200๋งŒ์›์„ ์ธ์ถœํ•˜๋Š” ๋ฒ•. ใ…‹ใ…‹ ์–ด๋–ค object๊ฐ€ modify ํ•˜๊ณ  ์žˆ๋Š” ์ค‘๊ฐ„์— ๋‹ค๋ฅธ ์ž‘์—…์ด ๋ผ์–ด๋“ค์–ด๋ฉด ์•ˆ๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

 

 


Single thread ์—์„œ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค. race hazard & race condition ์˜ ๊ฒฝ์šฐ ๋™์‹œ์— ๋ฌด์—‡์ธ๊ฐ€๋ฅผ ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. 

 

 


thread safe
state์˜ consistency๊ฐ€ ์œ ์ง€๋˜๋Š” ์ƒํ™ฉ์„ ๋งํ•œ๋‹ค. 

 


critical region
๋‘ ๊ฐœ ์ด์ƒ์˜ thread๊ฐ€ ๋™์‹œ์— ์ˆ˜ํ–‰๋˜์ง€ ๋ชปํ•˜๋Š” ์ƒํƒœ๋ฅผ ๋งํ•œ๋‹ค,
Synchronization mechanism
๋‘ ๊ฐœ์˜ thread๊ฐ€ ๋™์‹œ์— ์ˆ˜ํ–‰๋  ์ˆ˜ ์—†๋„๋ก ๋„์™€์ฃผ๋Š” ๋ฉ”์นด๋‹ˆ์ฆ˜์„ ๋งํ•œ๋‹ค.

 


Atomic operation
ํ•˜๋‚˜์˜ operation์˜ ๊ฒฝ์šฐ atomic operation. ์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ์ง„ํ–‰๋  ๋•Œ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋™์‹œ์— ์ง„ํ–‰๋œ ๋‹ค๋Š” ๊ฒƒ์ด ์—†๋Š” ๊ฒƒ์„ ์ „์ œ๋กœ ํ–ˆ์Œ. ํŠน๋ณ„ํžˆ ์กฐ์น˜ํ•˜์ง€ ์•Š์•„๋„ critical region์„ ๋ณด์žฅํ•œ๋‹ค๋Š” ๊ฐœ๋…(***) ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ช…์‹œํ•ด์ค˜์•ผ ํ•œ๋‹ค.  - > synchronized ๋ผ๋Š” ๊ฒƒ์„ ์‚ฌ์šฉ

synchronized void aMethod 
critical retion์„ ๋ณด์žฅํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ช…์‹œ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ

 


lock
ํ•˜๋‚˜์˜ Thread๋Š” critical region์— ๋“ค์–ด๊ฐ€๋ฉด lock์€ ํ•˜๋‚˜๋ฐ–์— ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. exclusive possesion์„ ํ•ด์•ผ ํ•˜๋‚˜์˜ task๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•ด๋‹น Thread๊ฐ€ critical region์„ ๋– ๋‚˜๋ฉด lock์„ ๋Œ๋ ค์ฃผ๊ฒŒ ๋œ๋‹ค.