์๋ฐ ๊ธฐ๋ณธ ์์ง ์๊ฒ ์ ๋ฆฌํ๊ธฐ! ๐ค
ํ๋ก์ธ์ค์ ์ค๋ ๋
- ํ๋ก์ธ์ค(process) : ์ด์์ฒด์ ์์ ์คํ ์ค์ธ ํ๋์ ์ ํ๋ฆฌ์ผ์ด์
์ ์๋ฏธ
- ๋ฉํฐ ํ์คํน(multi tasking)
- ์ด์ ์ฒด์ ์์ ๋ ๊ฐ์ง ์ด์์ ๋ค์ค ์์
(ํ๋ก์ธ์ค)๋ฅผ ๋์์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ์๋ฏธ.
- ์ด์ ์ฒด์ ์์๋ ๋ฉํฐ ํ์คํน์ ํ ์ ์๋๋ก CPU ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์์์ ์ ์ ํ ํ ๋นํ๊ณ ๋ณ๋ ฌ๋ก ์คํ์ํจ๋ค. ํ ๋น๋ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์คํํ๊ธฐ ๋๋ฌธ์ ๋
๋ฆฝ์ ์ด๋ค.
๋ฉ์ธ ์ค๋ ๋
- ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฉ์ธ ์ค๋ ๋(main thread)๊ฐ main() ๋ฉ์๋๋ฅผ ์คํ ํ๋ฉด์ ์์.
- ๋ฉ์ธ ์ค๋ ๋๋ ํ์์ ๋ฐ๋ผ ์์
์ค๋ ๋๋ฅผ ๋ง๋ค์ด ๋ณ๋ ฌ๋ก ์คํ ๊ฐ๋ฅํ๋ค.
- ์ฑ๊ธ ์ค๋ ๋์์๋ ๋ฉ์ธ ์ค๋ ๋๊ฐ ์ข
๋ฃ๋๋ฉด ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ๋์ง๋ง, ๋ฉํฐ ์ค๋ ๋ ์ ํ๋ฆฌ์ผ์ด์
์์๋ ์คํ ์ค์ธ ์ค๋ ๋๊ฐ ํ๋๋ผ๋ ์๋ค๋ฉด ํ๋ก์ธ์ค๋ ์ข
๋ฃ๋์ง ์๋๋ค.
์์
์ค๋ ๋ ์์ฑ๊ณผ ์คํ
- ์๋ฐ์์๋ ์ค๋ ๋๋ ๊ฐ์ฒด(ํด๋์ค)๋ก ์์ฑ๋๋ค.
implements runnable
- Runnable : ์์
์ค๋ ๋๊ฐ ์คํํ ์ ์๋ ์ฝ๋๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ฒด
- ์ธํฐํ์ด์ค ํ์
์ด๋ฏ๋ก
run()
์ ์ฌ์ ์ํ์ฌ ์คํ ์ฝ๋๋ฅผ ์์ฑ
1
|
Thread thread = new Thread(Runnable target);
|
start()
: ์์
์ค๋ ๋๋ ๋งค๊ฐ๊ฐ์ผ๋ก ๋ฐ์ Runnable์ run() ๋ฉ์๋๋ฅผ ์คํํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
Runnable task = new Task();
Thread thread = new Thread(task);
/* Ruunable ์ต๋ช
๊ฐ์ฒด */
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// ์ค๋ ๋๊ฐ ์คํํ ์ฝ๋
}
});
/* Java8 ๋๋ค์ */
Thread thread = new Thread(() -> {
// ์ค๋ ๋๊ฐ ์คํํ ์ฝ๋
});
// ์์
์ค๋ ๋ ์คํ
thread.start();
|
extends thread
Thread
ํด๋์ค๋ฅผ ์์ํ ํ run
๋ฉ์๋๋ฅผ ์ฌ์ ์(overriding
)ํด์ ์ค๋ ๋๊ฐ ์คํํ ์ฝ๋๋ฅผ ์์ฑ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class WorkerThread extends Thread {
@Override
public void run() {
// ์ค๋ ๋๊ฐ ์คํํ ์ฝ๋
}
}
Thread thread = new WorkerThread();
/* ์ต๋ช
์ ์์ ๊ฐ์ฒด๋ก ์์ฑ */
Thread thread = new Thread() {
@Override
public void run() {
// ์ค๋ ๋๊ฐ ์คํํ ์ฝ๋
}
};
|
implements Runnable vs extends Thread
- ์๋ฐ์์๋ ๋ค์ค ์์์ ํ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์
extends Thread
์ ๊ฒฝ์ฐ ๋ค๋ฅธ ํด๋์ค์ ์์์ ๋ฐ์ ์ ์๋ค.
- ์ธํฐํ์ด์ค์ ๊ฒฝ์ฐ ๋ค์ค ์์์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํด๋์ค๋ฅผ ์์ ๋ฐ์ ์ ์๋ค.
- ๊ทธ๋ฌ๋ฏ๋ก
implements Runnable
์ ํตํด ์ฌ ์ ์ํ์ฌ ํ์ฅํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
์ค๋ ๋์ ์ด๋ฆ
- ์ค๋ ๋๋ ์์ ์ ์ด๋ฆ์
setName()
๋ก ๋ณ๊ฒฝํ๋ค.
- ์ค๋ ๋ ๊ฐ์ฒด์ ์ฐธ์กฐ๊ฐ ํ์ํ ๊ฒฝ์ฐ
Thread.currentThread()
๋ก ์ฝ๋๋ฅผ ์คํํ๋ ํ์ฌ ์ค๋ ๋์ ์ฐธ์กฐ๋ฅผ ์ป์ ์ ์๋ค.
1
|
Thread thread = Thread.currentThread();
|
์ค๋ ๋์ ์ค์ผ์ค๋ง
- ๋์์ฑ(Concurrency) : ํ๋์ ์ฝ์ด์์ ๋ฉํฐ ์ค๋ ๋๊ฐ ๋ฒ๊ฐ์๊ฐ๋ฉฐ ์คํํ๋ ์ฑ์ง
- ๋ณ๋ ฌ์ฑ(Parallelism) : ๋ฉํฐ ์ฝ์ด์์ ๊ฐ๋ณ ์ค๋ ๋๋ฅผ ๋์์ ์คํํ๋ ์ฑ์ง
- ์ค๋ ๋์ ๊ฐ์๊ฐ ์ฝ์ด์ ์๋ณด๋ค ๋ง์ ๊ฒฝ์ฐ, ์ค๋ ๋๋ฅผ ์ด๋ค ์์์ ์ํด ๋์์ฑ์ผ๋ก ์คํํ ๊ฒ ์ธ๊ฐ๋ฅผ ๊ฒฐ์ ํด์ผ ํ๋ค. ์ด๊ฒ์ ์ค๋ ๋ ์ค์ผ์ค๋ง ์ด๋ผ๊ณ ํ๋ค.
์๋ฐ์ ์ค๋ ๋ ์ค์ผ์ค๋ง ๋ฐฉ์
- ์ฐ์ ์์(Priority)๋ฐฉ์
- ์ฐ์ ์์๊ฐ ๋์ ์ค๋ ๋๊ฐ ์คํ ๊ธฐํ๋ฅผ ๋ ๋ง์ด ๊ฐ๋๋ค.
- ์ค๋ ๋ ๊ฐ์ฒด์ ์ฐ์ ์์ ๋ฒํธ๋ฅผ ๋ถ์ฌํ ์ ์์ด ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ ์ ์ดํ ์ ์๋ค.
- ์ฐ์ ์์๋ ๋์์ฑ์์๋ง ์๋ฏธ๊ฐ ์๋ค๊ณ ๋ณผ ์ ์๋ค.
- ์ํํ ๋น(Round-Robin)๋ฐฉ์
- ์๊ฐ ํ ๋น๋
Time Slice
์ ์ ํด์ ํ๋์ ์ค๋ ๋๋ฅผ ์ ํด์ง ์๊ฐ๋งํผ ์คํํ๋ค.
์ค๋ ๋ ์ฐ์ ์์
- ์ฐ์ ์์๋ 1์์๋ถํฐ 10๊น์ง ๋ถ์ฌ. 1์ด ๊ฐ์ฅ์ฐ์ ์์๊ฐ ๋ฎ๊ณ 10์ด ๊ฐ์ฅ ๋์.
Thread
ํด๋์ค ์์๋ก๋ ์ง์ ํ ์ ์๋ค.
- ๋ง์ฝ ์ฟผ๋ ์ฝ์ด์ผ ๊ฒฝ์ฐ 4๊ฐ์ ์ค๋ ๋๊ฐ ๋ณ๋ ฌ์ฑ์ผ๋ก ์คํ ๋ ์ ์๊ธฐ ๋๋ฌธ์ 4๊ฐ ์ดํ์ ์ค๋ ๋๋ฅผ ์คํํ ๊ฒฝ์ฐ ์ฐ์ ์์ ๋ฐฉ์์ด ํฌ๊ฒ ์ํฅ์ ๋ฏธ์น์ง ๋ชปํจ.
1
2
3
|
thread.setPriority(Thread.MAX_PRIORITY); // 10
thread.setPriority(Thread.NORM_PRIORITY); // 5
thread.setPriority(Thread.MIN_PRIORITY); // 1
|
๋๊ธฐํ ๋ฉ์๋์ ๋๊ธฐํ ๋ธ๋ก
๊ณต์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ๋ ์ฃผ์ํ ์
- ๋ฉํฐ ์ค๋ ๋์์๋ ์ค๋ ๋๋ค์ด ๊ฐ์ฒด๋ฅผ ๊ณต์ ํด์ ์์
ํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์์.
- ์ค๋ ๋ A๋ฅผ ์ฌ์ฉํ๋ ๊ฐ์ฒด๊ฐ ์ค๋ ๋ B์ ์ํด ์ํ๊ฐ ๋ณ๊ฒฝ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์๋ํ๋ ๊ฒ๊ณผ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ฐ์ถ ๋ ์ ์๋ค.
synchronized
- ์๊ณ ์์ญ(critical section) : ๋ฉํฐ ์ค๋ ๋ ํ๋ก๊ทธ๋จ์์ ๋จ ํ๋์ ์ค๋ ๋๋ง ์คํํ ์ ์๋ ์ฝ๋ ์์ญ
- ์๋ฐ๋ ์๊ณ์์ญ์ ์ง์ ํ๊ธฐ ์ํด ๋๊ธฐํ(synchronize) ๋ฉ์๋์ ๋ธ๋ก์ ์ ๊ณต.
- ์ค๋ ๋๊ฐ ๊ฐ์ฒด ๋ด๋ถ์ ๋๊ธฐํ ๋ฉ์๋ ๋๋ ๋ธ๋ก์ ๋ค์ด๊ฐ๋ฉด ์ฆ์ ๊ฐ์ฒด์ ์ ๊ธ์ ๊ฑธ์ด ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์๊ณ ์์ญ ์ฝ๋๋ฅผ ์คํํ์ง ๋ชปํ๋๋ก ํ๋ค.
- synchronized ํค์๋๋ ์ธ์คํด์ค์ ์ ์ ๋ฉ์๋ ์ด๋๋ ๋ถ์ผ ์ ์๋ค.
1
2
3
|
public synchronized void method() {
// ์๊ณ ์์ญ;
}
|
1
2
3
4
5
6
7
8
9
|
public void method() {
// ์ฌ๋ฌ ์ค๋ ๋๊ฐ ์คํ ๊ฐ๋ฅํ ์์ญ
...
synchronized(๊ณต์ ๊ฐ์ฒด) { /*๋๊ธฐํ ๋ธ๋ก*/
// ์๊ณ ์์ญ
}
// ์ฌ๋ฌ ์ค๋ ๋๊ฐ ์คํ ๊ฐ๋ฅํ ์์ญ
...
}
|
์ค๋ ๋ ์ํ
- ์ค๋ ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ
start()
๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์คํ ๋๊ธฐ ์ํ๊ฐ ๋๋ค.
- ์คํ ๋๊ธฐ๋ ์์ง ์ค์ผ์ค๋ง์ด ๋์ง ์์ ์คํ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ ์ํ๋ฅผ ์๋ฏธํ๋ค.
- ์คํ ๋๊ธฐ ์ํ์ ์๋ ์ค๋ ๋ ์ค ์ค๋ ๋ ์ค์ผ์ค๋ง์ ์ํด CPU๋ฅผ ์ ์ ํ๊ณ
run()
๋ฉ์๋๋ฅผ ์คํํ๋ค.
- ์ผ์ ์ ์ง ์ํ : WAITING, TIMED_WAITING, BLOCKED
Thread.State ์ด๊ฑฐ ์์
์ํ |
์ด๊ฑฐ ์์ |
์ค๋ช
|
๊ฐ์ฒด ์์ฑ |
NEW |
์ค๋ ๋ ๊ฐ์ฒด ์์ฑ. ์์ง start() ๋ฉ์๋ ํธ์ถ ์ . |
์คํ ๋๊ธฐ |
RUNNABLE |
์คํ ์ํ๋ก ์ธ์ ๋ ์ง ๊ฐ ์ ์๋ ์ํ. |
์ผ์ ์ ์ง |
WAITING |
๋ค๋ฅธ ์ค๋ ๋๊ฐ ํต์ง(Notify)ํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ์ํ |
์ผ์ ์ ์ง |
TIMED_WAITING |
์ฃผ์ด์ง ์๊ฐ ๋์ ๊ธฐ๋ค๋ฆฌ๋ ์ํ |
์ผ์ ์ ์ง |
BLOCKED |
์ฌ์ฉํ๊ณ ์ ํ๋ ๊ฐ์ฒด์ ๋ฝ์ด ํ๋ฆด ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ์ํ |
์ข
๋ฃ |
TERMINATED |
์คํ์ ๋ง์น ์ํ |
์ค๋ ๋ ์ํ ์ ์ด
- ์ค๋ ๋ ์ํ ์ ์ด : ์คํ ์ค์ธ ์ค๋ ๋์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ
- ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์๋ ์ ๊ตํ ์ค๋ ๋ ์ํ ์ ์ด๊ฐ ํ์ํ๋ฉฐ, ์ค๋ ๋์ ์ํ ๋ณํ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฉ์๋๋ฅผ ํ์
ํด์ผ ํ๋ค.