๋ฉํฐ์ค๋ ๋ฉ์ผ๋ก ํด๊ฒฐ๋๋ ๋ฌธ์
๋ฉํฐ์ค๋ ๋ฉ์ ์ค์ ๋ก ๋ ๊ฐ์ง ์ค์ํ ๋ชฉํ๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํด ๋ฐ๋ช ๋์์ต๋๋ค.-
๋์์ ์ฌ๋ฌ ๊ฐ์ง ์์ ์ ์ํํฉ๋๋ค.
์์ ์์์ ์๋ก ๋ค๋ฅธ ์ค๋ ๋(๊ฐ์กฑ ๊ตฌ์ฑ์)๋ ์ฌ๋ฌ ์์ ์ ๋ณ๋ ฌ๋ก ์ํํ์ต๋๋ค. ์ค๊ฑฐ์ง, ๊ฐ๊ฒ์ ๊ฐ๊ธฐ, ๋ฌผ๊ฑด ํฌ์ฅํ๊ธฐ ๋ฑ์ด ์์ต๋๋ค.
ํ๋ก๊ทธ๋๋ฐ๊ณผ ๋ ๋ฐ์ ํ๊ฒ ๊ด๋ จ๋ ์๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค. ์ฌ์ฉ์ ์ธํฐํ์ด์ค๊ฐ ์๋ ํ๋ก๊ทธ๋จ์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ํ๋ก๊ทธ๋จ์์ '๊ณ์'์ ํด๋ฆญํ๋ฉด ์ผ๋ถ ๊ณ์ฐ์ด ์ํ๋๊ณ ์ฌ์ฉ์๋ ๋ค์ ํ๋ฉด์ ๋ณด๊ฒ ๋ฉ๋๋ค. ์ด๋ฌํ ์์ ์ด ์์ฐจ์ ์ผ๋ก ์ํ๋๋ฉด ์ฌ์ฉ์๊ฐ '๊ณ์' ๋ฒํผ์ ํด๋ฆญํ ํ ํ๋ก๊ทธ๋จ์ด ์ค๋จ๋ฉ๋๋ค. ์ฌ์ฉ์๋ ํ๋ก๊ทธ๋จ์ด ๋ชจ๋ ๋ด๋ถ ๊ณ์ฐ์ ์ํํ๊ณ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๊ฐ ์๋ก ๊ณ ์ณ์ง๋ ๋ถ๋ถ์ ๋๋ฌํ ๋๊น์ง '๊ณ์' ๋ฒํผ ํ๋ฉด์ด ์๋ ํ๋ฉด์ ๋ณด๊ฒ ๋ฉ๋๋ค.
๊ธ์, ์ฐ๋ฆฌ๋ ๋ช ๋ถ ๊ธฐ๋ค๋ฆด ๊ฒ ๊ฐ์์!
๋๋ ํ๋ก๊ทธ๋จ์ ์ฌ์์ ํ๊ฑฐ๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ๋งํ๋ ๊ฒ์ฒ๋ผ '๋ณ๋ ฌํ'ํ ์ ์์ต๋๋ค. ํ ์ค๋ ๋์์ ๊ณ์ฐ์ ์ํํ๊ณ ๋ค๋ฅธ ์ค๋ ๋์์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ทธ๋ ค๋ด ์๋ค. ๋๋ถ๋ถ์ ์ปดํจํฐ์๋ ์ด ์์ ์ ์ํํ ์ ์๋ ์ถฉ๋ถํ ๋ฆฌ์์ค๊ฐ ์์ต๋๋ค. ์ด ๊ฒฝ๋ก๋ฅผ ํํ๋ฉด ํ๋ก๊ทธ๋จ์ด ์ค๋จ๋์ง ์๊ณ ์ฌ์ฉ์๊ฐ ๋ด๋ถ์์ ์ผ์ด๋๋ ์ผ์ ๋ํด ๊ฑฑ์ ํ์ง ์๊ณ ํ๋ฉด ์ฌ์ด๋ฅผ ์ํํ๊ฒ ์ด๋ํ ์ ์์ต๋๋ค. ํ๋๋ ๋ค๋ฅธ ํ๋๋ฅผ ๋ฐฉํดํ์ง ์์ต๋๋ค :)
-
๋ ๋น ๋ฅด๊ฒ ๊ณ์ฐ์ ์ํํฉ๋๋ค.
์ฌ๊ธฐ์ ๋ชจ๋ ๊ฒ์ด ํจ์ฌ ๊ฐ๋จํฉ๋๋ค. ํ๋ก์ธ์์ ์ฌ๋ฌ ๊ฐ์ ์ฝ์ด๊ฐ ์๊ณ ์ค๋๋ ๋๋ถ๋ถ์ ํ๋ก์ธ์์ ์๋ ๊ฒฝ์ฐ ์ฌ๋ฌ ์ฝ์ด๊ฐ ์์ ๋ชฉ๋ก์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๋ถ๋ช ํ ์ฐ๋ฆฌ๊ฐ 1000๊ฐ์ ์์ ์ ์ํํด์ผ ํ๊ณ ๊ฐ๊ฐ 1์ด๊ฐ ๊ฑธ๋ฆฐ๋ค๋ฉด ํ๋์ ์ฝ์ด๋ 1000์ด ์์, ๋ ๊ฐ์ ์ฝ์ด๋ 500์ด ์์, ์ธ ๊ฐ์ ์ฝ์ด๋ 333์ด๋ณด๋ค ์ฝ๊ฐ ๋ ๋ง์ ์๊ฐ์ ๋ชฉ๋ก์ ์๋ฃํ ์ ์์ต๋๋ค.
public class MyFirstThread extends Thread {
@Override
public void run() {
System.out.println("I'm Thread! My name is " + getName());
}
}
์ค๋ ๋๋ฅผ ๋ง๋ค๊ณ ์คํํ๋ ค๋ฉด ํด๋์ค๋ฅผ ๋ง๋ค๊ณ java.lang ์ ์์ํด์ผ ํฉ๋๋ค . ํด๋์ค๋ฅผ ์ค๋ ๋ ํ๊ณ ํด๋น run() ๋ฉ์๋๋ฅผ ์ฌ์ ์ํฉ๋๋ค. ๋ง์ง๋ง ์๊ตฌ ์ฌํญ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ค๋ ๋๊ฐ ์คํํ ๋
ผ๋ฆฌ๋ฅผ ์ ์ํ๋ ๊ฒ์ run() ๋ฉ์๋ ์ ์์ต๋๋ค . ์ด์ MyFirstThread ์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ณ ์คํํ๋ฉด run () ๋ฉ์๋๋ ์ด๋ฆ์ด ์๋ ์ค์ ํ์ํฉ๋๋ค. getName() ๋ฉ์๋๋ ์๋์ผ๋ก ํ ๋น๋๋ ์ค๋ ๋์ '์์คํ
' ์ด๋ฆ์ ํ์ํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ ์ฐ๋ฆฌ๋ ์ ์ ์ ์ผ๋ก ๋งํ๊ณ ์์ต๋๊น? ํ๋๋ฅผ ๋ง๋ค๊ณ ์์๋ณด์!
public class Main {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
MyFirstThread thread = new MyFirstThread();
thread.start();
}
}
}
์ฝ์ ์ถ๋ ฅ: ์ ๋ Thread์
๋๋ค! ์ ์ด๋ฆ์ Thread-2์
๋๋ค. ์ ๋ Thread์
๋๋ค! ์ ์ด๋ฆ์ Thread-1์
๋๋ค. ์ ๋ Thread์
๋๋ค! ์ ์ด๋ฆ์ Thread-0์
๋๋ค. ์ ๋ Thread์
๋๋ค! ์ ์ด๋ฆ์ Thread-3์
๋๋ค. ์ ๋ Thread์
๋๋ค! ์ ์ด๋ฆ์ Thread-6์
๋๋ค. ์ ๋ Thread์
๋๋ค! ์ ์ด๋ฆ์ Thread-7์
๋๋ค. ์ ๋ Thread์
๋๋ค! ์ ์ด๋ฆ์ Thread-4์
๋๋ค. ์ ๋ Thread์
๋๋ค! ์ ์ด๋ฆ์ Thread-5์
๋๋ค. ์ ๋ Thread์
๋๋ค! ์ ์ด๋ฆ์ Thread-9์
๋๋ค. ์ ๋ Thread์
๋๋ค! ๋ด ์ด๋ฆ์ Thread-8์
๋๋ค. 10๊ฐ์ ์ค๋ ๋( Thread ๋ฅผ ์์ํ๋ MyFirstThread ๊ฐ์ฒด ) ๋ฅผ ๋ง๋ค๊ณ ๊ฐ ๊ฐ์ฒด์ ๋ํด start() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ค๋ ๋๋ฅผ ์์ํ๊ฒ ์ต๋๋ค . start() ๋ฉ์๋๋ฅผ ํธ์ถํ ํ run() ๋ฉ์๋ ์ ๋
ผ๋ฆฌ๊ฐ ์คํ๋ฉ๋๋ค. ์ฐธ๊ณ : ์ค๋ ๋ ์ด๋ฆ์ ์์๊ฐ ์์ต๋๋ค. ๊ทธ๋ค์ด ์์ฐจ์ ์ผ๋ก ๊ทธ๋ ์ง ์์ ๊ฒ์ด ์ด์ํฉ๋๋ค., Thread-1 , Thread-2 ๋ฑ? ๊ณต๊ต๋กญ๊ฒ๋ ์ด๊ฒ์ '์์ฐจ์ ' ์ฌ๊ณ ๊ฐ ๋ง์ง ์๋ ์๋์ ์์
๋๋ค. ๋ฌธ์ ๋ 10๊ฐ์ ์ค๋ ๋๋ฅผ ๋ง๋ค๊ณ ์คํํ๋ ๋ช
๋ น๋ง ์ ๊ณตํ๋ค๋ ๊ฒ์
๋๋ค. ํน์ ์ด์ ์ฒด์ ๋ฉ์ปค๋์ฆ์ธ ์ค๋ ๋ ์ค์ผ์ค๋ฌ๊ฐ ์คํ ์์๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ์ ํํ ๋์์ธ๊ณผ ์์ฌ ๊ฒฐ์ ์ ๋ต์ ์ง๊ธ ๋น์ฅ ๊น์ด ๋
ผ์ํ์ง ์์ ์ฃผ์ ์
๋๋ค. ๊ธฐ์ตํด์ผ ํ ์ฃผ์ ์ฌํญ์ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ค๋ ๋์ ์คํ ์์๋ฅผ ์ ์ดํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์ํฉ์ ์ฌ๊ฐ์ฑ์ ์ดํดํ๋ ค๋ฉด ์์ ์์์ main() ๋ฉ์๋๋ฅผ ๋ช ๋ฒ ๋ ์คํํด ๋ณด์ญ์์ค. ๋ ๋ฒ์งธ ์คํ ์ ์ฝ์ ์ถ๋ ฅ: ๋๋ ์ค๋ ๋๋ค! ์ ์ด๋ฆ์ Thread-0์
๋๋ค. ์ ๋ Thread์
๋๋ค! ์ ์ด๋ฆ์ Thread-4์
๋๋ค. ์ ๋ Thread์
๋๋ค! ์ ์ด๋ฆ์ Thread-3์
๋๋ค. ์ ๋ Thread์
๋๋ค! ์ ์ด๋ฆ์ Thread-2์
๋๋ค. ์ ๋ Thread์
๋๋ค! ์ ์ด๋ฆ์ Thread-1์
๋๋ค. ์ ๋ Thread์
๋๋ค! ์ ์ด๋ฆ์ Thread-5์
๋๋ค. ์ ๋ Thread์
๋๋ค! ์ ์ด๋ฆ์ Thread-6์
๋๋ค. ์ ๋ Thread์
๋๋ค! ์ ์ด๋ฆ์ Thread-8์
๋๋ค. ์ ๋ Thread์
๋๋ค! ์ ์ด๋ฆ์ Thread-9์
๋๋ค. ์ ๋ Thread์
๋๋ค! ๋ด ์ด๋ฆ์ Thread-7 ์ธ ๋ฒ์งธ ์คํ์ ์ฝ์ ์ถ๋ ฅ: I'm Thread! ์ ์ด๋ฆ์ Thread-0์
๋๋ค. ์ ๋ Thread์
๋๋ค! ์ ์ด๋ฆ์ Thread-3์
๋๋ค. ์ ๋ Thread์
๋๋ค! ์ ์ด๋ฆ์ Thread-1์
๋๋ค. ์ ๋ Thread์
๋๋ค! ์ ์ด๋ฆ์ Thread-2์
๋๋ค. ์ ๋ Thread์
๋๋ค! ์ ์ด๋ฆ์ Thread-6์
๋๋ค. ์ ๋ Thread์
๋๋ค! ์ ์ด๋ฆ์ Thread-4์
๋๋ค. ์ ๋ Thread์
๋๋ค! ์ ์ด๋ฆ์ Thread-9์
๋๋ค. ์ ๋ Thread์
๋๋ค! ์ ์ด๋ฆ์ Thread-5์
๋๋ค. ์ ๋ Thread์
๋๋ค! ์ ์ด๋ฆ์ Thread-7์
๋๋ค. ์ ๋ Thread์
๋๋ค! ๋ด ์ด๋ฆ์ ์ค๋ ๋-8์
๋๋ค.
๋ฉํฐ์ค๋ ๋ฉ์ผ๋ก ์ธํ ๋ฌธ์
์ฑ ์ ๋ํ ์์์ ๋ฉํฐ์ค๋ ๋ฉ์ด ๋งค์ฐ ์ค์ํ ์์ ์ ํด๊ฒฐํ๊ณ ํ๋ก๊ทธ๋จ์ ๋ ๋น ๋ฅด๊ฒ ๋ง๋ค ์ ์์์ ํ์ธํ์ต๋๋ค. ์ข ์ข ๋ช ๋ฐฐ ๋ ๋น ๋ฆ ๋๋ค. ๊ทธ๋ฌ๋ ๋ฉํฐ์ค๋ ๋ฉ์ ์ด๋ ค์ด ์ฃผ์ ๋ก ์ฌ๊ฒจ์ง๋ค. ์ค์ ๋ก ๋ถ์ ์ ํ๊ฒ ์ฌ์ฉํ๋ฉด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋์ ๋ฌธ์ ๋ฅผ ๋ง๋ญ๋๋ค. ๋ด๊ฐ '๋ฌธ์ ๋ฅผ ์ผ์ผํจ๋ค'๊ณ ๋งํ ๋ ์ด๋ค ์ถ์์ ์ธ ์๋ฏธ๊ฐ ์๋๋๋ค. ๋ค์ค ์ค๋ ๋ฉ์ด ์์ฑํ ์ ์๋ ๋ ๊ฐ์ง ํน์ ๋ฌธ์ ๋ ๊ต์ฐฉ ์ํ์ ๊ฒฝํฉ ์ํ์ ๋๋ค. ๊ต์ฐฉ ์ํ๋ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ์๋ก ๋ณด์ ํ๊ณ ์๋ ๋ฆฌ์์ค๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์๊ณ ๊ทธ ์ค ์ด๋ ๊ฒ๋ ๊ณ์ ์คํํ ์ ์๋ ์ํฉ์ ๋๋ค. ๋ค์ ์์ ์์ ๋ ์์ธํ ์ด์ผ๊ธฐํ๊ฒ ์ต๋๋ค. ์ง๊ธ์ ๋ค์ ์์ ๋ก ์ถฉ๋ถํฉ๋๋ค. Thread-1์ด ์ผ๋ถ Object-1๊ณผ ์ํธ ์์ฉํ๊ณ Thread-2๊ฐ Object-2์ ์ํธ ์์ฉํ๋ค๊ณ ์์ํด ๋ณด์ญ์์ค. ๋ํ ํ๋ก๊ทธ๋จ์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑ๋ฉ๋๋ค.- Thread-1์ Object-1๊ณผ์ ์ํธ ์์ฉ์ ์ค์งํ๊ณ Thread-2๊ฐ Object-2์์ ์ํธ ์์ฉ์ ์ค๋จํ๊ณ Object-1๋ก ์ ํ๋๋ ์ฆ์ Object-2๋ก ์ ํํฉ๋๋ค.
- Thread-2๋ Object-2์์ ์ํธ ์์ฉ์ ์ค์งํ๊ณ Thread-1์ด Object-1๊ณผ์ ์ํธ ์์ฉ์ ์ค๋จํ๊ณ Object-2๋ก ์ ํ๋๋ ์ฆ์ Object-1๋ก ์ ํํฉ๋๋ค.
public class MyFirstThread extends Thread {
@Override
public void run() {
System.out.println("Thread executed: " + getName());
}
}
public class Main {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
MyFirstThread thread = new MyFirstThread();
thread.start();
}
}
}
์ด์ ํ๋ก๊ทธ๋จ์ด ์์์ ์๋ฆฌํ๋ ๋ก๋ด์ ์คํํ๋ ์ญํ ์ ํ๋ค๊ณ ์์ํด ๋ณด์ญ์์ค! Thread-0์ ๋์ฅ๊ณ ์์ ๊ณ๋์ ๊บผ๋
๋๋ค. Thread-1์ ์คํ ๋ธ๋ฅผ ์ผญ๋๋ค. Thread-2๋ ํฌ์ ๊ฐ์ ธ์ ์คํ ๋ธ ์์ ๋์ต๋๋ค. Thread-3๊ฐ ์คํ ๋ธ์ ๋ถ์ ๋ถ์
๋๋ค. Thread-4๊ฐ ํฌ์ ๊ธฐ๋ฆ์ ๋ถ์ต๋๋ค. Thread-5๋ ๊ณ๋์ ๊นจ์ ํฌ์ ๋ถ์ต๋๋ค. Thread-6๋ ๋ฌ๊ฑ ๊ป์ง์ ์ฐ๋ ๊ธฐํต์ ๋ฒ๋ฆฝ๋๋ค. Thread-7์ ๋ฒ๋์์ ์ตํ ๊ณ๋์ ์ ๊ฑฐํฉ๋๋ค. Thread-8์ ์ตํ ๊ณ๋์ ์ ์์ ๋ด์ต๋๋ค. Thread-9๊ฐ ์ค๊ฑฐ์ง๋ฅผ ํฉ๋๋ค. ํ๋ก๊ทธ๋จ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ญ์์ค: ์คํ๋ ์ค๋ ๋: ์ค๋ ๋-0 ์คํ๋ ์ค๋ ๋: ์ค๋ ๋-2 ์คํ๋ ์ค๋ ๋-1 ์คํ๋ ์ค๋ ๋: ์ค๋ ๋-4 ์คํ๋ ์ค๋ ๋: ์ค๋ ๋-9 ์คํ๋ ์ค๋ ๋: ์ค๋ ๋-5 ์คํ๋ ์ค๋ ๋: ์ค๋ ๋-8 ์ค๋ ๋ ์คํ๋จ: ์ค๋ ๋-7 ์คํ๋ ์ค๋ ๋: ์ค๋ ๋-3 ์ฝ๋ฏธ๋ ๋ฃจํด์ธ๊ฐ์? :) ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ ํ๋ก๊ทธ๋จ์ ์์
์ ์ค๋ ๋์ ์คํ ์์์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์
๋๋ค. ํ์ํ ์์๋ฅผ ์กฐ๊ธ์ด๋ผ๋ ์๋ฐํ๋ฉด ์ฐ๋ฆฌ ๋ถ์์ ์ง์ฅ์ผ๋ก ๋ณํ๊ณ ๋ฏธ์น ๋ก๋ด์ด ์ฃผ๋ณ์ ๋ชจ๋ ๊ฒ์ ํ๊ดดํฉ๋๋ค. ์ด๋ ๋ค์ค ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ์์ ํํ ๋ฐ์ํ๋ ๋ฌธ์ ์ด๊ธฐ๋ ํฉ๋๋ค. ๊ทธ๊ฒ์ ๋ํด ํ ๋ฒ ์ด์ ๋ฃ๊ฒ ๋ ๊ฒ์
๋๋ค. ์ด ์์
์ ๋ง์น๋ฉด์ ๋ฉํฐ์ค๋ ๋ฉ์ ๊ดํ ์ฑ
์ ์ถ์ฒํ๊ณ ์ถ์ต๋๋ค. 'Java Concurrency in Practice'๋ 2006๋
์ ์์ฑ๋์์ง๋ง ๊ด๋ จ์ฑ์ ์์ง ์์์ต๋๋ค. ๊ธฐ๋ณธ๋ถํฐ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ค์ ๋ฐ ๋ฐํจํด์ ์ด๋ฅด๊ธฐ๊น์ง ๋ค์ค ์ค๋ ๋ Java ํ๋ก๊ทธ๋๋ฐ ์ ์ฉ์
๋๋ค. ์ธ์ ๊ฐ ๋ฉํฐ์ค๋ ๋ฉ ์ ๋ฌธ๊ฐ๊ฐ ๋๊ธฐ๋ก ๊ฒฐ์ฌํ๋ค๋ฉด ์ด ์ฑ
์ ๋ฐ๋์ ์ฝ์ด์ผ ํ ์ฑ
์
๋๋ค. ๋ค์ ์์
์์ ๋ง๋์! :)
GO TO FULL VERSION