์ค๋ ๋ ์ฐธ์กฐ๊ฐ.start()
)๐ก start() ๋ฉ์๋ ์ด์ฉํด์ ์คํํ๋ฉด ๋ฐ๋ก ์คํ๋๋ ๊ฒ์ด ์๋๋ผ ์คํ ๋๊ธฐ ์ํ๊ฐ ๋๊ณ ์คํ์ ์ด์์ฒด์ ์ ๊ณํ์ ๋ฐ๋ผ ์ด์์ฒด์ ๊ฐ ์คํ !
Runnable ์ธํฐํ์ด์ค ๊ตฌํํ ํด๋์ค์์ run() ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉํด์ ์ฌ์ ์
(Run() ๋ฉ์๋ ์์ ์ฝ๋ ์์ฑ)
-> Thread๋ฅผ ์์๋ฐ์ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ Thread ํด๋์ค๋ฅผ ์ง์ ์ธ์คํด์คํ ํ๋ฉด์ Runnable์ ๊ตฌํํ ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ๋ฐ์์ผํจ
Thread ํด๋์ค ์์๋ฐ์ ํ์ ํด๋์ค์์ run() ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉํด์ ์ฌ์ ์
(Run() ๋ฉ์๋ ์์ ์ฝ๋ ์์ฑ)
-> Thread ํด๋์ค ์ง์ ์ธ์คํด์คํ ํ ํ์ ์๊ณ ๋ฐ๋ก ๊ตฌํํด์ฃผ๋ฉด ๋จ
์ต๋ช ์ Runnable ๊ตฌํ ๊ฐ์ฒด๋ฅผ ํ์ฉํ์ฌ Thread๋ฅผ ์์ฑ ํ ๊ทธ ์์ run() ๋ฉ์๋ ์ ์ด์ค
๐ก Runnerble ์ธํฐํ์ด์ค
- ์ถ์๋ฉ์๋๋ก ์ ์๋์ด ์์
(์ค๋ ๋์๊ฒ ์์ ๋งก๊ธฐ๋ ค๋ฉด ๋ฌด์กฐ๊ฑด ์ด ์ธํฐํ์ด์ค ๊ตฌํํด์ผํจ)- Thread ํด๋์ค๋ Runnable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค์
๋ ์ค๋ ๋๊ฐ ๋ณ๋ ฌ๋ก ๋์ ์คํ๋์ด ๋ ๋ฉ์๋์ ๋ฐํ๊ฐ๋ค์ด ๋๋ค์ ์์๋ก ์ถ๋ ฅ๋จ
-> ์์๋ฅผ ์ ํด์ค ํ์๊ฐ ์์ !
๐ก ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๊ฒฝ์ฐ ํ์ธ์ ์ํด ๋ง์ด ์ฐ์ด๋ ๋ฉ์๋
- ์ค๋ ๋ ์ด๋ฆ ์กฐํ -
์ค๋ ๋ ์ฐธ์กฐ๊ฐ.getName()
-> ๋ฉ์ธ ์ค๋ ๋์ ์ด๋ฆ : Main
-> ์์ ์ค๋ ๋์ ์ด๋ฆ : Thread - ์ซ์
โ - ์ค๋ ๋ ์ด๋ฆ ์ค์ -
์ค๋ ๋ ์ฐธ์กฐ๊ฐ.setName()
โ - ์ค๋ ๋ ์ธ์คํด์ค์ ์ฃผ์๊ฐ ์ป๊ธฐ -
Thread.currentThread()
-> ์คํ๋๊ณ ์๋ ๊ทธ ์์น์ Thread๋ฅผ ๋ฆฌํด
โ - ์ค๋ ๋ ์ํ ํ์ธ -
์ค๋ ๋ ์ฐธ์กฐ๊ฐ.getState()
-> start() ๋ฉ์๋๋ก ์คํํ๊ธฐ ์ ๊น์ง๋new
์ํ
-> ์คํ ํ์๋runnable
์ํ
-> Thread๊ฐ ๋ชจ๋ ์ข ๋ฃ๋ ํ์๋terminate
์ํ
๋๊ธฐํ ๋ธ๋ญ์๋ ๊ทธ๋ฅ this๊ฐ ๋ค์ด๊ฐ๋ค ์๊ฐํด ๋ค๋ฅธ ๊ฑฐ ๋ค์ด๊ฐ๋ ๊ฑฐ ๊ฑฐ์ ๋ชป๋ดค๋
-> synchronized
ํค์๋
synchronized
synchronized(ํด๋น ์์ญ์ด ํฌํจ๋ ๊ฐ์ฒด์ ์ฐธ์กฐ this) {์คํํ ์ฝ๋}
milliSecond ๋์ ์ค๋ ๋๋ฅผ ์ ์ ๋ฉ์ถค(์คํ ์ํ์์ ์ผ์ ์ ์ง(TIMED_WAITING) ์ํ๋ก ์ ํ)(์๊ฐ์ ์ฝ๊ฐ์ ์ค์ฐจ๋ฅผ ๊ฐ์ง)
Thread์ ํด๋์ค ๋ฉ์๋์ด๊ธฐ ๋๋ฌธ์ ํด๋์ค๋ฅผ ํตํด Thread.sleep(์๊ฐ);
์ผ๋ก ํธ์ถ
์ธ์๋ก ์ ๋ฌํ ์๊ฐ๋งํผ์ ์๊ฐ์ด ๊ฒฝ๊ณผํ ๊ฒฝ์ฐ / interrupt()
ํธ์ถํ ๊ฒฝ์ฐ ์คํ๋๊ธฐ ์ํ๋ก ๋ณต๊ท
try{ Thread.sleep(์๊ฐ); } catch () { ์คํ๋ฌธ } ์ด๋ ๊ฒ ๊ฐ์ธ์ ์คํํด์ค์ผํจ
์ผ์ ์ค์ง ์ํ์ธ ์ค๋ ๋๋ฅผ ์คํ ๋๊ธฐ ์ํ(Runnable)๋ก ๋ณต๊ท์ํด
๋ฉ์ถ ์ค๋ ๋๋ง๊ณ ๋ค๋ฅธ ์ค๋ ๋์์ ๋ฉ์ถฐ ์๋ ์ค๋ ๋.interrupt()
ํธ์ถํ๋ฉด, ๊ธฐ์กด์ ํธ์ถ๋์ด ์ค๋ ๋๋ฅผ ๋ฉ์ถ๊ฒ ํ๋ ๋ฉ์๋์์ ์์ธ๊ฐ ๋ฐ์๋๊ณ , ๊ทธ์ ๋ฐ๋ผ ์ผ์ ์ ์ง๊ฐ ํ๋ฆฌ๊ฒ ๋จ
์ด์์ฒด์ ์ ์ค์ผ์ค๋ฌ์๊ฒ ํ ๋น๋ฐ์ ์๊ฐ์ ํ ์ค๋ ๋๊ฐ ์ํํ๋ค๊ฐ yield() ํธ์ถํ๋ฉด ๋จ์ ์๊ฐ์ ๋ค์ ์ค๋ ๋์๊ฒ ์๋ณด
while๋ฌธ์์ ๋ฌด์๋ฏธํ ๋ฐ๋ณต์ด๋๊ณ ์์ ๋, yield() ํธ์ถํ๋ฉด ๋ฐ๋ณต์ ๋ฉ์ถ๊ณ ์คํ๋๊ธฐ ์ํ๋ก ๋ฐ๋ -> ๋จ์ ์คํ์๊ฐ์ ๋๊ธฐ์ด ์ ์ฐ์ ์์๊ฐ ๋์ ๋ค๋ฅธ ์ค๋ ๋์๊ฒ ์๋ณด
join()๊ณผ sleep()
โ
1. ๊ณตํต์
- ํธ์ถํ๋ฉด ์ผ์์ ์ง ์ํ๊ฐ ๋จ
- try...catch๋ฌธ์ผ๋ก ๊ฐ์ธ์ ์ฌ์ฉ
- interrupt()๋ก ์คํ๋๊ธฐ ์ํ๋ก ๋ณต๊ท
- ์ฐจ์ด์
- sleep() - Thread ํด๋์ค์ static ๋ฉ์๋
- join() - ํน์ ์ค๋ ๋์๋ํด ๋์ํ๋ ์ธ์คํด์ค ๋ฉ์๋
-> JVM(Java Virtual Machine)์ด๋ผ๋ ์ ๊ฐ ์ด์์ฒด์ ๋ง๋ค Java ์์ค ์ฝ๋๋ฅผ ์ด์์ฒด์ ์ ๋ง๊ฒ ๋ณํํด์ ์คํ์์ผ์ฃผ์ด ์ด์์ฒด์ ์ ๋
๋ฆฝ์ ์ผ๋ก ๋์ํจ
(์ด์์ฒด์ ์ Java ์ฌ์ด์ ๋ค๋ฆฌ๊ฐ JVM)
-> JVM์ด ์ด์์ฒด์ ํํ
ํ์ํ ์ปดํจํฐ ์์ ์ฃผ๋ฌธ -> ์ด์์ฒด์ ๊ฐ ๊ฐ์ฉ ์์ ํ์ธ ํ JVM์๊ฒ ํ ๋น (์ฌ๊ธฐ์ ํ ๋น๋ฐ์ ๊ฒ => ๋ฐํ์ ๋ฐ์ดํฐ ์์ญ(Runtime Data Area))
Java๋ก ์์ค์ฝ๋ ์์ฑ/์คํ
์ปดํ์ผ๋ฌ ์คํ๋๋ฉด์ ์ปดํ์ผ ์งํ
์ปดํ์ผ ๊ฒฐ๊ณผ๋ก .java ํ์ฅ์ ๊ฐ์ก๋ ์์ค์ฝ๋๊ฐ .class ํ์ฅ์ ๊ฐ์ง ๋ฐ์ดํธ ์ฝ๋ ํ์ผ๋ก ๋ณํ๋จ
JVM์ด ์ด์์ฒด์ ๋ก๋ถํฐ ์์ค ์ฝ๋ ์คํ์ ํ์ํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น๋ฐ์
ํด๋์ค ๋ก๋(Class Loader)๊ฐ ๋ณํ๋ ์ฝ๋ ํ์ผ์ JVM ๋ด๋ถ๋ก ๋ถ๋ฌ๋ค์ฌ ๋ฐํ์ ๋ฐ์ดํฐ ์์ญ(Runtime Data Area)์ ์ ์ฌ (๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ ์ํค๋ ๊ฒ)
์คํ ์์ง(Execution Engine)์ด ์ ์ฌ๋ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์คํ์ํด(2๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก)
-> ๊ธฐ๋ณธ์ ์ผ๋ก ์ธํฐํ๋ฆฌํฐ(Interpreter) ํตํด ์ฝ๋๋ฅผ ํ ์ค์ฉ ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญํ๊ณ ์คํ
-> ์ค๋ณต์ ์ผ๋ก ์ด๋ค ๋ฐ์ดํธ ์ฝ๋๊ฐ ๋ฑ์ฅํ ๋, JIT Compiler(Just-In-Time Compiler) ํตํด ๋ฐ์ดํธ ์ฝ๋ ์ ์ฒด๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญํ๊ณ ์คํ
๐ก LIFO(Last In First Out)๋?
- ๋ง์ง๋ง์ ๋ค์ด๊ฐ ๋ฐ์ดํฐ๊ฐ ๊ฐ์ฅ ๋จผ์ ๋์จ๋ค
- Stack์ ๋ฐ์ดํฐ ์ ์ถ๋ ฅ ์์๋ฅผ ๋ํ๋ด๋ ์์น
Ex. ํ๋ง๊ธ์ค
=> Stack ์์ญ์ ์ ์ฅ๋์ด์๋ ์ฐธ์กฐ๋ณ์๋ฅผ ํตํด Heap ์์ญ์ ์กด์ฌํ๋ ๊ฐ์ฒด๋ฅผ ๋ค๋ฃฌ๋ค
(Stack์ ์ฐธ์กฐ๊ฐ, Heap์ ๋ฐ์ดํฐ -> new์ฐ์ฐ์๋ก Heap์ ์ ์ฅ๋ ์ฐธ์กฐ๊ฐ์ ๋ฆฌํดํจ)
- Minor GC - Heap ์์ญ ์ Young ์์ญ์์ ํ๋ํ๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ
- Major GC - Heap ์์ญ ์ Old ์์ญ์์ ํ๋ํ๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ
๊ทธ๋๋ ์ค๋ ํ์ต์ ์ด์ ํ๋ stream ๋ณด๋ค ๊ด์ฐฎ์๋ค!! ์ด์ ๋๋ฌด ๋ฉ๋ถ์ด์์ด์,, ๊ทธ๋๋ ์ค๋ ์ค์ ์ ํ์ด๋ ๋ฌธ์ ํ์ด์ผํด์ ์ดํดํ๋ ค๊ณ ์ด์ฌํ ๊ณต๋ถํ๋๋ฐ ๊ทธ ๊ฒฐ๊ณผ๋ก Stream ๊ตฌ์กฐ๋ฅผ ์ดํดํ๊ณ ๋๋ ์ด๋ฒ ๋ฌธ์ ๋ค์ ๊ทธ๋๋ ์ ์ ํ๋ ธ๋ค ใ ใ ๋ฌธ์ ํ๋ ๋ ๋ค ์ค์ ์ ์ผ ์ฌ์ ๋ ๋ ๊ฐ๋ค!! ์ค๋์ ๊ธฐ๋ถ ์ข์ ๋ ! ์ฃผ๋ง์๋ ๋นก๊ณตํด์ผ์ง ใ ใ