SKILL/JAVA

์ž๋ฐ” : ์Šค๋ ˆ๋“œ(1)

Jedy_Kim 2021. 9. 7. 20:06
728x90

๐Ÿš€  ํ”„๋กœ์„ธ์Šค?

์šฐ์„  ์Šค๋ ˆ๋“œ๋ฅผ ์•Œ๊ธฐ ์ „ ๋ฐ˜๋“œ์‹œ "ํ”„๋กœ์„ธ์Šค"๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•„์•ผ๋งŒ ํ•œ๋‹ค. ๊ทธ๋ž˜์•ผ ์™œ ์Šค๋ ˆ๋“œ๋ฅผ ์“ฐ๋Š”์ง€๋ฅผ ์•Œ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณดํ†ต ๋‹ค์–‘ํ•˜๊ฒŒ ์ •์˜ํ•œ๋‹ค. ๊ทธ์ค‘ "์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ"์ด๋ผ๋Š” ํ‘œํ˜„์„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” "ํ”„๋กœ๊ทธ๋žจ"์ด๋ผ๋Š” ๋‹จ์–ด์˜ ์ •์˜๋ฅผ ์•Œ์•„๋ณด์ž.

ํ”„๋กœ๊ทธ๋žจ์ด๋ž€? 
์ปดํŒŒ์ผํ•œ ์ฝ”๋“œ์™€ ์ดˆ๊ธฐํ™” ์ „์—ญ ๋ณ€์ˆ˜, ๋ฌธ์ž์—ด๊ณผ ๋ฌธ์ž์—ด ์ƒ์ˆ˜ ๋“ฑ ์ •์  ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” ์ •์ ์ธ ๊ฐœ์ฒด์ด๋‹ค. 

๊ทธ๋ ‡๋‹ค๋ฉด "์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ"์„ ํ’€์–ด์„œ ํ•ด์„ํ•ด๋ณด๋ฉด, ๋””์Šคํฌ์— ์žˆ๋˜ ํ”„๋กœ๊ทธ๋žจ์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌํ•˜์—ฌ ์šด์˜์ฒด์ œ์˜ ์ œ์–ด๋ฅผ ๋ฐ›๋Š” ์ƒํƒœ๊ฐ€ ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ. ์ฆ‰, ์ž์‹ ๋งŒ์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด ์žˆ์Œ์„ ๋œปํ•œ๋‹ค. ๊ฒฐ๊ตญ ํ”„๋กœ์„ธ์Šค์˜ ์ •์˜๋‹ค.

ํ”„๋กœ์„ธ์Šค ์ •์˜๋ฅผ ์ข€ ๋” ์„ธ๋ จ๋˜๊ฒŒ ์ •๋ฆฌํ•˜์ž๋ฉด, ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ด๋ฃจ๊ณ , ํ”„๋กœ๊ทธ๋žจ ์นด์šดํ„ฐ๋‚˜ ๋ ˆ์ง€์Šคํ„ฐ์ฒ˜๋Ÿผ ํ˜„์žฌ ์–ด๋–ค ์ž์›์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋“ค์–ด ์žˆ๋Š” ๋™์ ์ธ ๊ฐœ์ฒด๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ ํ”„๋กœ์„ธ์Šค๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ๊ฐ–๋Š”๋‹ค.

์šด์˜์ฒด์ œ๋Š” ํ”„๋กœ์„ธ์Šค์˜ ์‹คํ–‰์„ ์ œ์–ดํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ์„ธ์Šค๋Š” ์‹คํ–‰ํ•˜๋ฉด์„œ ์ƒํƒœ๊ฐ€ ๋ณ€ํ•˜๋ฏ€๋กœ(์ƒ์„ฑ, ์ค€๋น„, ์‹คํ–‰, ๋Œ€๊ธฐ, ์ข…๋ฃŒ,...) ์šด์˜์ฒด์ œ๋Š” ํ”„๋กœ์„ธ์Šค ์ œ์–ด์— ํ•„์š”ํ•œ ์ƒํƒœ๋ฅผ ์ ๊ฒ€ํ•˜๊ณ  ํ”„๋กœ์„ธ์Šค๋ฅผ ์ œ์–ดํ•œ๋‹ค.

๋Œ€๋žต์ ์œผ๋กœ ์š”์•ฝํ•˜์ž๋ฉด ์ด๋ ‡๋‹ค. ๋ฌผ๋ก  ํ”„๋กœ์„ธ์Šค ์ œ์–ด๋ธ”๋ก ๋“ฑ ์•Œ์•„์•ผ ํ•  ๊ฒƒ๋“ค์ด ๋งŽ์ด ์žˆ์œผ๋‚˜ ์ด๋ฒˆ ๋ธ”๋กœ๊น… ์ฃผ์ œ๋ฅผ ๋„˜์–ด๊ฐ€๋ฏ€๋กœ ์—ฌ๊ธฐ๊นŒ์ง€๋งŒ ์–ธ๊ธ‰ํ•˜๊ฒ ๋‹ค.

๐Ÿš€  ์Šค๋ ˆ๋“œ?

์œ„์—์„œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฃผ์ €๋ฆฌ์ฃผ์ €๋ฆฌ ์„ค๋ช…ํ•œ ์ด์œ ๋Š” ์Šค๋ ˆ๋“œ๋ž€ ๋…€์„์€ ๊ฒฐ๊ตญ ํ”„๋กœ์„ธ์Šค์˜ ์•ˆ์—์„œ ํ™œ๋™ํ•˜๋Š” ๋…€์„์ด๊ธฐ์— ํ”„๋กœ์„ธ์Šค๋ฅผ ์ „ํ˜€ ์•Œ์ง€ ๋ชปํ•˜๊ณ ์„œ๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ์‹œ์ž‘๋  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 
์œ„์˜ ํ”„๋กœ์„ธ์Šค ๋‚ด์šฉ๋“ค์„ ํฐ ํ‹€์—์„œ ํ‚ค์›Œ๋“œ๋ฅผ ๋ฝ‘์•„๋ณด์ž๋ฉด ์ž์›๊ณผ ์ œ์–ด๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์ค‘ ์ œ์–ด๋งŒ ๋ถ„๋ฆฌํ•œ ์‹คํ–‰ ๋‹จ์œ„๋ฅผ ์Šค๋ ˆ๋“œ๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ํ”„๋กœ์„ธ์Šค ํ•˜๋‚˜๋Š” ์Šค๋ ˆ๋“œ ํ•œ ๊ฐœ ์ด์ƒ์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

์ข€ ๋” ํŠน์ง•๋“ค์„ ๋‚˜์—ดํ•ด๋ณด๊ฒ ๋‹ค..
- ์Šค๋ ˆ๋“œ๋“ค์€ ํ”„๋กœ์„ธ์Šค์˜ ์ง์ ‘ ์‹คํ–‰ ์ •๋ณด๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ ์ •๋ณด๋ฅผ ๊ณต์œ ํ•œ๋‹ค.(์ง์ ‘ ์‹คํ–‰ ์ •๋ณด : ์Šคํƒ, ๋ ˆ์ง€์Šคํ„ฐ // ๋‚˜๋จธ์ง€ ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ ์ •๋ณด : ๋ฉ”๋ชจ๋ฆฌ(์ฝ”๋“œ, ์ „์—ญ ๋ฐ์ดํ„ฐ, ํž™)) -> ๊ทธ๋ฆผ 1์„ ๋ณด๋ฉด ํ”„๋กœ์„ธ์Šค ์•ˆ์˜ ๋ชจ์Šต์ด๋‹ค.

- ์Šค๋ ˆ๋“œ๋Š” ํ”„๋กœ๊ทธ๋žจ ์นด์šดํ„ฐ์™€ ์Šคํƒ ํฌ์ธํ„ฐ ๋“ฑ์„ ๋น„๋กฏํ•œ ์Šค๋ ˆ๋“œ ์‹คํ–‰ ํ™˜๊ฒฝ ์ •๋ณด(๋ฌธ๋งฅ ์ •๋ณด), ์ง€์—ญ ๋ฐ์ดํ„ฐ, ์Šคํƒ ๋“ฑ์„ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐ€์ง€๋ฉด์„œ ์ฝ”๋“œ, ์ „์—ญ ๋ฐ์ดํ„ฐ, ํž™์„ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์™€ ๊ณต์œ ํ•œ๋‹ค.

- ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค์˜ ์Šค๋ ˆ๋“œ๋“ค์€ ๋™์ผํ•œ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๊ณต์œ ํ•œ๋‹ค.

ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•˜๋‚˜์ธ ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์„œ์—์„œ ํ”„๋กœ๊ทธ๋žจ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์„ ๋™์‹œ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์Šค๋ ˆ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด ๋‹ค์Œ ์ด์ ์ด ์žˆ๋‹ค.
1.  ์‚ฌ์šฉ์ž ์‘๋‹ต์„ฑ ์ฆ๊ฐ€ : ์‘์šฉํ”„๋กœ๊ทธ๋žจ์˜ ์ผ๋ถ€๋ถ„์„ ๋ด‰์‡„ํ•˜๊ฑฐ๋‚˜ ๊ธด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋”๋ผ๋„ ๋ณ‘๋ ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ณ„์† ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์–ด ์‚ฌ์šฉ์ž ์‘๋‹ต์„ฑ์ด ์ฆ๊ฐ€ํ•œ๋‹ค.
2. ํ”„๋กœ์„ธ์Šค์˜ ์ž์›๊ณผ ๋ฉ”๋ชจ๋ฆฌ ๊ณต์œ  ๊ฐ€๋Šฅ
3. ๊ฒฝ์ œ์„ฑ์ด ์ข‹๋‹ค.
4. ๋‹ค์ค‘ ์ฒ˜๋ฆฌ(๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์‹ฑ)๋กœ ์„ฑ๋Šฅ๊ณผ ํšจ์œจ์„ฑ์ด ํ–ฅ์ƒ๋œ๋‹ค.

์ข€ ๋” ํ’€์–ด์„œ ์„ค๋ช…์„ ํ•˜๋ฉด ํ”„๋กœ์„ธ์Šค ํ•˜๋‚˜ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ๋งŽ์€ ์ž์›์ด ํ•„์š”ํ•˜๋‹ค. ๋งŒ์•ฝ ํ•˜๋‚˜์˜ ์ž‘์—…์„ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋„์›Œ์„œ ์‹คํ–‰ํ•˜๋ฉด ๊ฐ๊ฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•ด์•ผ๋งŒ ํ•œ๋‹ค. JVM์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์•„๋ฌด๋Ÿฐ ์˜ต์…˜ ์—†์ด ์‹คํ–‰ํ•˜๋ฉด, ์ ์–ด๋„ 32MB ~ 64MB์˜ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ์œ ํ•œ๋‹ค. ๊ทธ์— ๋ฐ˜์—์„œ ์Šค๋ ˆ๋“œ ํ•˜๋‚˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด 1MB ์ด๋‚ด์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ์œ ํ•œ๋‹ค. ๋” ๋น ๋ฅธ ์‹œ๊ฐ„์— ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•ด์ฃผ๊ณ  ๋ณด๋‹ค ๋น ๋ฅธ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

์ž๋ฐ”์—์„œ ํด๋ž˜์Šค ํŒŒ์ผ์„ ์—๋””ํ„ฐ๋ฅผ ํ†ตํ•ด์„œ๋“  ์ง์ ‘ ํ•˜๋“  ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด, ์ ์–ด๋„ ํ•˜๋‚˜์˜ JVM์ด ์‹œ์ž‘๋œ๋‹ค. ์ด๋ ‡๊ฒŒ JVM์ด ์‹œ์ž‘๋˜๋ฉด, ์ž๋ฐ” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹œ์ž‘ํ•œ๋‹ค. ์ด ํ”„๋กœ์„ธ์Šค๋ผ๋Š” ์šธํƒ€๋ฆฌ ์•ˆ์—์„œ ํ•˜๋‚˜ ํ˜น์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋“ค์ด ๋™์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค.

์ด ์ •๋„๋ฉด ์Šค๋ ˆ๋“œ์˜ ๋‹น์œ„์„ฑ์€ ์ถฉ๋ถ„ํžˆ ์„ค๋ช…์ด ๋˜์—ˆ์„ ๊ฑฐ๋ผ ์ƒ๊ฐํ•˜๋ฉฐ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž

๊ทธ๋ฆผ1

๐ŸŽฏ Runnable ์ธํ„ฐํŽ˜์ด์Šค์™€ Thread ํด๋ž˜์Šค

์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ํฌ๊ฒŒ Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ, Thread ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. ๋ชจ๋‘ java.lang ํŒจํ‚ค์ง€์— ์žˆ๋‹ค. ๋˜ Thread ํด๋ž˜์„œ๋Š” Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์˜€๋‹ค. ์‚ฌ์‹ค์ƒ ๊ฐ™์€ ๋…€์„์ด๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์™œ? ๊ตณ์ด ๋‘ ๊ฐ€์ง€์˜ ๋ฐฉ์‹์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์ผ๊นŒ? 

๊ทธ ์ด์œ ๋Š” ์ƒ์†์ด๋ผ๋Š” ๊ด€์ ์—์„œ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์›์ธ์„ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. ์ž๋ฐ”์—์„œ๋Š” ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋งŒ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์„ฑ. ์ฆ‰, ๋‹ค์ค‘ ์ƒ์†์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ๋‚ด๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•ด์•ผ ํ•˜๋Š”๋ฐ ๊ทธ ๋‹ค๋ฅธ ํด๋ž˜์Šค๊ฐ€ Thread๋ฅผ ํ™•์žฅํ•˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด ๋” ์ด์ƒ ํ™•์žฅํ•  ๊ธธ์ด ์—†๋Š” ๊ฒƒ์ด๋‹ค. ํ•œ๋งˆ๋””๋กœ ์–ด๋–ค ์ƒํ™ฉ์—์„œ๋Š” ๋‹ค์ค‘ ์ƒ์†์ด ํ•„์š”ํ•ด์ง„๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
์ด ์‹œ์ ์— ์ธํ„ฐํŽ˜์ด์Šค ํŠน์ง•์„ ์‚ดํŽด๋ณด๋ฉด ์š” ๋…€์„์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด๋„ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์ด ๋ถ€๋ถ„์„ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜๋ฉด ํ™•์žฅ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” Thread ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. 

์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด์ž

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package com.study;
 
// Runnable interface ๊ตฌํ˜„
class RunnableSample1 implements Runnable {
    @Override
    public void run() {
        System.out.println("my runnable thread !");
    }
}
 
// Thread ํด๋ž˜์Šค ์ƒ์†
class ThreadsSample1 extends Thread {
    @Override
    public void run() {
        System.out.println("my thread !");
    }
}
 
// entry point
public class RunThreads {
    public static void main(String[] args) {
        RunThreads sample = new RunThreads();
        sample.runBasic();
    }
 
    public void runBasic() {
        RunnableSample1 runable = new RunnableSample1();
        new Thread(runable).start();
 
        ThreadsSample1 thread = new ThreadsSample1();
        thread.start();
 
        System.out.println("End!");
    }
}
 
cs

 

์Šค๋ ˆ๋“œ๊ฐ€ ์ˆ˜ํ–‰๋˜๋Š” ๊ตฌํ˜„ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋Š” run() ๋ฉ”์„œ๋“œ์ด๋‹ค.
์Šค๋ ˆ๋“œ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋Š” start()์ด๋‹ค.
Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ RunnableSample1 ํด๋ž˜์Šค๋ฅผ ์Šค๋ ˆ๋“œ๋กœ ๋ฐ”๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์—†๋‹ค. ๋ฐ˜๋“œ์‹œ Thread ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์— ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์‹œ์ž‘ํ•ด ์ฃผ์–ด์•ผ๋งŒ ํ•œ๋‹ค.

 

 

์ฝ”๋“œ์˜ ๊ฒฐ๊ณผ์ด๋‹ค. ์ด ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์ˆœ์„œ๊ฐ€ ๊ณ„์† ๋ฐ”๋€Œ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Š” ์œ„์˜ ์Šค๋ ˆ๋“œ ์„ค๋ช…์„ ๋ณด๋ฉด ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ”๋กœ ๋”ฐ๋กœ(๋ณ‘๋ ฌ) ์ผ์„ ๋™์‹œ์— ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. start()๋ฅผ ํ†ตํ•ด ์‹œ์ž‘ํ•˜๋ฉด ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๊ฐ€ JVM์— ์ถ”๊ฐ€ํ•˜์—ฌ ์‹คํ–‰๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ์‹คํ–‰๋œ ์Šค๋ ˆ๋“œ๋“ค์€ ์Šค๋ ˆ๋“œ๋“ค ๋งˆ๋‹ค ๋๋‚˜๋Š” ์ˆœ์„œ๊ฐ€ ๊ทธ๋•Œ๊ทธ๋•Œ ๋‹ค๋ฅธ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋ณธ์ธ์˜ ์ž„๋ฌด๋ฅผ ์™„๋ฃŒํ•œ ์ฆ‰์‹œ ์ข…๋ฃŒํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์„œ ํ•˜๋‚˜ ์งš๊ณ  ๋„˜์–ด๊ฐ€์•ผ ํ•  ์ ์€ ์Šค๋ ˆ๋“œ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค ๋ณ„๋„์˜ ์Šคํƒ์ด ํ• ๋‹น๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

๐ŸŽฏ ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.study;
 
class EndlessThread1 extends Thread {
    @Override
    public void run() {
        while(true) {
            try {
                System.out.println(System.currentTimeMillis());
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
 
// entry point
public class RunThreads {
    public static void main(String[] args) {
        RunThreads sample = new RunThreads();
        sample.endless();
    }
 
    public void endless() {
        EndlessThread1 thread = new EndlessThread1();
        thread.start();
    }
 
}
cs

 

์œ„์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œ์ผœ๋ณด๋ฉด main() ๋ฉ”์„œ๋“œ์˜ ์ˆ˜ํ–‰์ด ๋๋‚˜๋„, main() ๋ฉ”์„œ๋“œ๋‚˜, ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ์—์„œ ์‹œ์ž‘ํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒํ•˜์ง€ ์•Š์œผ๋ฉด ํ•ด๋‹น ์ž๋ฐ” ํ”„๋กœ์„ธ์Šค๋Š” ๋๋‚˜์ง€ ์•Š๋Š”๋‹ค. 
์ด์ œ ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ๋ณด์ž.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.study;
 
class DaemonThread1 extends Thread {
    @Override
    public void run() {
        while (true) {
            try {
                System.out.println(System.currentTimeMillis());
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
 
// entry point
public class RunThreads {
    public static void main(String[] args) {
        RunThreads sample = new RunThreads();
        sample.runDaemonThread();
    } 
 
    public void runDaemonThread() {
        DaemonThread1 thread = new DaemonThread1();
        thread.setDaemon(true);
        thread.start();
    }
 
}
cs

 

์œ„์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œ์ผœ๋ณด๋ฉด ์•ž์˜ ์ฝ”๋“œ์—์„œ setDaemon๋งŒ ์ถ”๊ฐ€๋˜์—ˆ์ง€๋งŒ, ๋ฌดํ•œ๋ฃจํ”„์— ๋น ์ง€์ง€ ์•Š๊ณ  ์ข…๋ฃŒ๊ฐ€ ๋˜์–ด๋ฒ„๋ฆฐ๋‹ค. ์ฆ‰ ์–ด๋–ค ์Šค๋ ˆ๋“œ๋ฅผ ๋ฐ๋ชฌ์œผ๋กœ ์ง€์ •ํ•˜๋ฉด, ๊ทธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ˆ˜ํ–‰๋˜๊ณ  ์žˆ๋“ , ์ˆ˜ํ–‰๋˜์ง€ ์•Š๊ณ  ์žˆ๋“  ์ƒ๊ด€์—†์ด JVM์ด ๋๋‚  ์ˆ˜ ์žˆ๋‹ค. ๋‹จ ํ•ด๋‹น ์Šค๋ ˆ๋“œ๊ฐ€ ์‹œ์ž‘๋˜๊ธฐ ์ „ ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ๊ฐ€ ์ง€์ •๋˜์–ด์•ผ๋งŒ ํ•œ๋‹ค.(setDaemon(true))
๊ทธ๋Ÿฌ๋ฉด ์™œ? ์ด๋Ÿฌํ•œ ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค์—ˆ์„๊นŒ?

์ž๋ฐ”์—์„œ ์Šค๋ ˆ๋“œ๋Š” ๊ฐ์ž์˜ ์ž‘์—…์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ณ„์†ํ•ด์„œ ์ž‘์—…์„ ํ•˜๊ฒŒ ๋˜์–ด ์žˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ํ•„์š”์— ๋”ฐ๋ผ์„œ ๊ณ„์†ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ์Šค๋ ˆ๋“œ๋„ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฌธ์„œ ํŽธ์ง‘๊ธฐ์— ์ž๋™ ์ €์žฅ ๊ธฐ๋Šฅ์ด ์žˆ๊ณ , ๊ทธ ์ž๋™ ์ €์žฅ ๊ธฐ๋Šฅ์ด ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ๋กœ ๋Œ๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •์„ ํ•ด๋ณด์ž.
์ด๋•Œ ๋ฌธ์„œ ํŽธ์ง‘๊ธฐ๊ฐ€ ๋๋‚˜๋ฉด ์ž๋™ ์ €์žฅ ๊ธฐ๋Šฅ ์Šค๋ ˆ๋“œ๋Š” ์‚ฌ๋ผ์ง€๋Š” ๊ฒŒ ๋‹น์—ฐํ•œ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜์˜จ ๊ฒƒ์ด ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ์ด๋‹ค.

๋ฐ๋ชฌ(daemon) ์Šค๋ ˆ๋“œ
: ์ฃผ ์Šค๋ ˆ๋“œ์˜ ์ž‘์—…์„ ๋•๋Š” ๋ณด์กฐ์ ์ธ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์Šค๋ ˆ๋“œ
: ์ฃผ ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ๋Š” ๊ฐ•์ œ์ ์œผ๋กœ ์ž๋™ ์ข…๋ฃŒ
 => ์›Œ๋“œ ํ”„๋กœ์„ธ์„œ์˜ ์ž๋™ ์ €์žฅ, ๋ฏธ๋””์–ด ํ”Œ๋ ˆ์ด์–ด์˜ ๋™์˜์ƒ ๋ฐ ์Œ์•… ์žฌ์ƒ, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ

 

๐ŸŽฏ Synchronized

์–ด๋–ค ํด๋ž˜์Šค๋‚˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์Šค๋ ˆ๋“œ์— ์•ˆ์ „ํ•˜๋ ค๋ฉด, synchronized๋ฅผ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ํ•œ๋‹ค.
์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•œ ๊ฐ์ฒด์— ์„ ์–ธ๋œ ๋ฉ”์„œ๋“œ์— ์ ‘๊ทผํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋™์‹œ์— ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๊ฐ’์ด ๊ผฌ์ด๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ๋งค๊ฐœ๋ณ€์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ์ง€์—ญ ๋ณ€์ˆ˜๋งŒ ๋‹ค๋ฃจ๋Š” ๋ฉ”์„œ๋“œ๋Š” ์ „ํ˜€ ํ•„์š”๊ฐ€ ์—†๋‹ค.

synchronized๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
- ๋ฉ”์„œ๋“œ ์ž์ฒด๋ฅผ synchronized๋กœ ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ• : synchronized methods
- ๋ฉ”์„œ๋“œ ๋‚ด์˜ ํŠน์ • ๋ฌธ์žฅ๋งŒ synchronized๋กœ ๊ฐ์‹ธ๋Š” ๋ฐฉ๋ฒ• : synchronized statements

๋งŒ์•ฝ ์ด synchronized๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ๋ฉ”์„œ๋“œ ์„ ์–ธ๋ถ€์— ์žˆ์œผ๋ฉด, ๋™์ผํ•œ ๊ฐ์ฒด์˜ ์ด ๋ฉ”์„œ๋“œ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์ ‘๊ทผํ•˜์—ฌ๋„ ํ•œ ์ˆœ๊ฐ„์—๋Š” ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

๐ŸŽฏ Synchronized : synchronized methods

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package com.study;
 
class CommonCalc {
    private int amount;
 
    public CommonCalc() {
        amount = 0;
    }
    public void plus(int value) {
        amount += value;
    }
    public void minus(int value) {
        amount -= value;
    }
    public int getAmount() {
        return amount;
    }
}
 
class ModifyAmountThread1 extends Thread {
    private CommonCalc calc;
    private boolean addflag;
 
    public ModifyAmountThread1(CommonCalc calc, boolean addFlag) {
        this.calc = calc;
        this.addflag = addFlag;
    }
 
    @Override
    public void run() {
        for(int i = 0; i < 10000; i++) {
            if(addflag) {
                calc.plus(1);
            } else {
                calc.minus(1);
            }
        }
    }
}
 
// entry point
public class RunThreads {
    public static void main(String[] args) {
        RunThreads sample = new RunThreads();
        sample.runCommonCalc();
    }
 
    public void runCommonCalc() {
        CommonCalc calc = new CommonCalc();
        ModifyAmountThread1 thread1 = new ModifyAmountThread1(calc, true);
        ModifyAmountThread1 thread2 = new ModifyAmountThread1(calc, true);
 
        thread1.start();
        thread2.start();
 
        try {
            thread1.join();
            thread2.join();
 
            System.out.println("Final value is " + calc.getAmount());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
 
    }
 
}
cs
์œ„์˜ ์ฝ”๋“œ์—์„œ runCommonCalc()๋ฅผ ํ†ตํ•ด thread1, thread2 ๊ฐ€ ์‹คํ–‰๋œ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ฐ๊ฐ 10000 ์”ฉ plus ํ•˜์—ฌ 20000์ด๋ผ๋Š” ๊ฐ’์„ ๊ธฐ๋Œ€ํ•˜๊ฒ ์ง€๋งŒ ๋ง‰์ƒ ์‹คํ–‰์„ ์‹œ์ผœ๋ณด๋ฉด, "Final value is 15749" ์ด๋Ÿฐ ์‹์œผ๋กœ ์ด์ƒํ•œ ๊ฐ’์ด ์ฐํž ๊ฒƒ์ด๋‹ค. ๋˜ ์—ฌ๋Ÿฌ ๋ฒˆ ์ˆ˜ํ–‰์‹œํ‚ฌ ๋•Œ๋งˆ๋‹ค ๊ฐ’์ด ๋ฐ”๋€” ๊ฒƒ์ด๋‹ค. ์ด๋Š” ๋‘ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์ผ ๊ฐ์ฒด์˜ plus๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์— ๋™์‹œ์— ์ ‘๊ทผํ•˜์—ฌ ๊ฐ’์„ ๊ฒฝ์‹ ํ•˜์˜€๊ธฐ์— ๊ผฌ์ธ ๊ฒƒ์ด๋‹ค. ์ฆ‰ thread1์€ ๋ฐ์ดํ„ฐ๊ฐ€ 1์ผ ๋•Œ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ 1์„ ๋”ํ•ด์„œ ๊ฐฑ์‹ ์‹œ์ผฐ๋Š”๋ฐ, thread2๋„ ๋ฐ์ดํ„ฐ๊ฐ€ 1์ผ ๋•Œ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋™์‹œ์— 1์„ ์ฆ๊ฐ€์‹œ์ผœ ๋ฒ„๋ฆฐ ๊ผด์ด ๋œ ๊ฒƒ์ด๋‹ค. ์›๋ž˜์˜ ๊ฐ’ 1๊ณผ, thread1์˜ 1, thread2์˜ 1์ด ๋”ํ•ด์ ธ์„œ 3์ด ๋˜์–ด์•ผ ํ–ˆ์ง€๋งŒ 2๊ฐ€ ์ฐํ˜€๋ฒ„๋ฆฐ ๊ฒƒ์ด๋‹ค. 

์ด ์ƒํ™ฉ์ด ์€ํ–‰์—์„œ ๋ฒŒ์–ด์กŒ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž ๋”์ฐํ•œ ์žฌ์•™์ด ๋  ๊ฒƒ์ด๋‹ค...

plus ๋ฉ”์„œ๋“œ์— synchronized๋ฅผ ๋ถ™์—ฌ์ฃผ๊ณ  ์‹คํ–‰์„ ํ•ด๋ณด๋ฉด, ์šฐ๋ฆฌ๊ฐ€ ์ƒ๊ฐํ•œ "Final value is 20000" ๊ทธ ๊ฐ’์ด ์ฐํžŒ๋‹ค. ์ด์ œ plus๋ฉ”์„œ๋“œ๋Š” ์Šค๋ ˆ๋“œ์— ์•ˆ์ „ํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

1
2
3
    public synchronized void plus(int value) {
        amount += value;
    }
cs

 

๐ŸŽฏ Synchronized : synchronized statesments

์œ„์—์„œ์ฒ˜๋Ÿผ ๋ฉ”์„œ๋“œ ์ „์ฒด๋ฅผ synchronized ํ•ด๋ฒ„๋ฆด ๊ฒฝ์šฐ ์„ฑ๋Šฅ์ƒ ๋ฌธ์ œ์ ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. 
์˜ˆ๋ฅผ ๋“ค์–ด ์–ด๋–ค ํด๋ž˜์Šค์— 30์ค„์งœ๋ฆฌ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ๊ทธ ํด๋ž˜์Šค์—๋„ amount๋ผ๋Š” ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๊ฐ€ ์žˆ๊ณ , 30์ค„์งœ๋ฆฌ ๋ฉ”์„œ๋“œ์—์„œ amount๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ํ•œ ์ค„์—์„œ๋งŒ ๋‹ค๋ฃฌ๋‹ค. ๋งŒ์•ฝ ํ•ด๋‹น ๋ฉ”์„œ๋“œ ์ „์ฒด๋ฅผ synchronized๋กœ ์„ ์–ธํ•œ๋‹ค๋ฉด, ๋‚˜๋จธ์ง€ 29์ค„์˜ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ๋•Œ ํ•„์š” ์—†๋Š” ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์—๋Š” ๋ฉ”์„œ๋“œ ์ „์ฒด๋ฅผ ๊ฐ์‹ธ๋ฉด ์•ˆ ๋˜๋ฉฐ, amount๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„๋งŒ synchronized ์ฒ˜๋ฆฌ๋ฅผ ํ•ด ์ฃผ๋ฉด ๋œ๋‹ค.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    // synchronized (this) ์ดํ›„์— ์žˆ๋Š” ์ค‘๊ด„ํ˜ธ ๋‚ด์— ์žˆ๋Š” ์—ฐ์‚ฐ๋งŒ ๋™์‹œ์— ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ฒ ๋‹ค๋Š” ๋œป์ด๋‹ค.
    public void plus(int value) {
        synchronized (this) {
            amount += value;            
        }
    }
    
    // ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•œ๋‹ค.
    Object lock = new Object();
    public synchronized void minus(int value) {
        synchronized (lock) {
            amount -= value;            
        }
    }
cs
์—ฌ๊ธฐ์„œ ์‚ฌ์šฉํ•œ lock์ด๋ผ๋Š” ๊ฐ์ฒด๋‚˜, ์•ž์„œ ์‚ฌ์šฉํ•œ this๋Š” ๋ชจ๋‘ ๋ฌธ์ง€๊ธฐ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋ฌธ์ง€๊ธฐ๋Š” ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ์ผ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•ด์ค€๋‹ค. ๋งŒ์•ฝ ๋ธ”๋ก์— ๋“ค์–ด๊ฐ„ ์Šค๋ ˆ๋“œ๊ฐ€ ์ผ์„ ๋‹ค ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‚˜์˜ค๋ฉด, ๋ฌธ์ง€๊ธฐ๋Š” ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋Š” ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—๊ฒŒ ๊ธฐํšŒ๋ฅผ ์ค€๋‹ค.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    private int amount;
    private int interest;
 
    public CommonCalc() {
        amount = 0;
        interest = 0;
    }
    
    private Object interestLock = new Object();
    private Object amountLock   = new Object();
    
    public void plus(int value) {
        synchronized (amountLock) {
            amount += value;
        }
    }    
    
    public void addInterest(int value) {
        synchronized (interestLock) {
            interest += value;
        }
    }
cs

 

๋•Œ์— ๋”ฐ๋ผ์„œ ์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ amount, interest ๋‘ ๊ฐœ์˜ ๋ณ€์ˆ˜ ๋ชจ๋‘ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ์ ‘๊ทผํ•˜๋ฉด ์•ˆ ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿด ๋•Œ lock์ด๋ผ๋Š” ํ•˜๋‚˜์˜ ์ž ๊ธˆ์šฉ ๊ฐ์ฒด๋งŒ ์‚ฌ์šฉํ•˜๋ฉด amount๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ, interest๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ ค๋Š” ๋ถ€๋ถ„๋„ ์ฒ˜๋ฆฌ๋ฅผ ๋ชปํ•˜๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ, ๋‘ ๊ฐœ์˜ ๋ณ„๋„์˜ lock ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํšจ์œจ์ ์ธ ํ”„๋กœ๊ทธ๋žจ์ด ๋œ๋‹ค.

 

๐Ÿš€  ๋งˆ๋ฌด๋ฆฌ

์—ฌ๊ธฐ๊นŒ์ง€ ์ž๋ฐ” ์Šค๋ ˆ๋“œ๋ฅผ ๋“ค์–ด๊ฐ€๊ธฐ์— ์•ž์„œ ๊ฐœ๋…์„ ์‚ดํŽด๋ณด์•˜๊ณ  ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•ด์„œ ๋Œ€๋žต์ ์œผ๋กœ ์‚ดํŽด๋ณด์•˜๋‹ค ๋ฌผ๋ก  ์ด์™ธ์—๋„ ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์›ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋ธ”๋กœ๊น… ๋ชฉ์ ์€ ์Šค๋ ˆ๋“œ์˜ ํฐ ํ‹€๊ณผ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ดํ•ดํ•˜๊ณ  ๋Œ€๋žต์ ์ธ ๋ถ€๋ถ„์„ ์ฝ”๋“œ๋กœ ์‚ดํŽด๋ณด๊ณ ์ž ์ด๋ ‡๊ฒŒ ๊ธ€์„ ์ผ๋‹ค. 2ํŽธ์—์„œ๋Š” ์Šค๋ ˆ๋“œ ์ƒํƒœ ์ •๋ณด ๊ด€๋ จํ•ด์„œ ์•Œ์•„๋ณผ ์˜ˆ์ •์ด๋‹ค.

 

 

์ถœ์ฒ˜: 

- [๊ต์žฌ] ๊ทธ๋ฆผ์œผ๋กœ ๋ฐฐ์šฐ๋Š” ๊ตฌ์กฐ์™€ ์›๋ฆฌ ์šด์˜์ฒด์ œ (๊ตฌํ˜„ํšŒ ์ €)

- [๊ต์žฌ] ์ž๋ฐ”์˜์‹  (์ด์ƒ๋ฏผ ์ €)
- https://yoonemong.tistory.com/216 [Sw.Dev]

- https://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html

- https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html

 

 

๋ฐ˜์‘ํ˜•