Thread
Process μ Thread
νλ‘μΈμ€μ μ€λ λλ μλ‘ λ°μ ν κ΄κ³μ μμΌλ μλ‘ λ€λ₯Έ κ°μ²΄μ΄λ€.
- Process
- OS λ‘λΆν° μμ€ν μμμ ν λΉλ°λ μμ μ λ¨μ
- CPU μκ°μ΄λ λ©λͺ¨λ¦¬ λ±μ μμ€ν μμμ΄ ν λΉλλ λ 립μ μΈ κ°μ²΄
- κ° νλ‘μΈμ€λ λ³λμ μ£Όμ 곡κ°μμ μ€ν λλ©°, ν νλ‘μΈμ€λ λ€λ₯Έ νλ‘μΈμ€μ λ³μλ μλ£κ΅¬μ‘°μ μ κ·Όν μ μμ
- κ°μ λ©λͺ¨λ¦¬λ₯Ό μ½κ³ μ°λ νλ‘μΈμ€λ μμ± κ°λ₯
- νλ‘μΈμ€κ°μ ν΅μ μ Pipe, Socket, File λ±μΌλ‘ ν΅μ νλ€.
- Thread
- νλ‘μΈμ€κ° ν λΉλ°μ μμ μ μ΄μ©νλ μ€ν νΉμ νλ¦μ λ¨μ
- νλ‘μΈμ€μ κ°μ 곡κ°μ Stack 곡κ°μ μ¬μ©νλ©° μ¬λ¬ Thread λ κ·Έ μνμ μΌλΆλ₯Ό 곡μ νλ€.
- Thread λ νλ‘μΈμ€ λ΄μμ κ°κ°μ
Stack
λ§ λ°λ‘ ν λΉ λ°κ³Code
Data
Heap
μμμ 곡μ νλ€.
Thread μ λλΆλΆμ μ 보λ€μ JVM μ μν΄ κ΄λ¦¬λλ€.
- λͺ κ°μ Thread κ° μ‘΄μ¬νλμ§
- μ€νμ€μΈ νλ‘κ·Έλ¨μ μ½λμ λ©λͺ¨λ¦¬ μμΉλ μ΄λμΈμ§
- νμ¬ Thread μ μν
- Thread μ μ°μ μμ μ 보
Thread ꡬ쑰
@TODO
Thread μλͺ μ£ΌκΈ°
@TODO
Thread μμ±λ°©λ²
μλμ κ°μ΄ ν¬κ² 3κ°μ§ λ°©λ²μ΄ μλ€.
Thread
ν΄λμ€λ₯Ό νμ₯ νλ€.Runnable
μΈν°νμ΄μ€λ₯Ό ꡬν- Thread Pool μ μμ±νκΈ° μν΄, μ΄ν리μΌμ΄μ
μμ
Executor
νλ μμν¬λ₯Ό μ¬μ©νλ€.
'Runnable' μΈν°νμ΄μ€λ μμ κ°μ²΄λ₯Ό νμλ‘ νμ§ μκΈ° λλ¬Έμ μΈν°νμ΄μ€λ‘ μ μ νλ€.
μ΄λ¬ν λ°©λ²λ€μ λλΆλΆ λ©ν°μ€λ λλ₯Ό λ§λ€μ΄ μμ μ μννλ κ³Όμ μΌλ‘ λ©ν°μ€λ λ μμμμ μμΈν λ°©λ²λ€μ μκ°νλ€.
Thread μν
NEW
: Thread κ° μ€ν μ€λΉκ° λμμ΅λλ€.RUNNABLE
: JVM (Java Virtual Machine) μ΄ Thread μ½λλ₯Ό μνμ€μ λλ€.BLOCKED
: Thread κ° μ°¨λ¨λμ΄ μλ μν μ λλ€.WAITING
: Thread λ€λ₯Έ Thread μ μμ μ΄ μνλκΈ°λ₯Ό κΈ°λ€λ¦½λλ€.TIMED_WAITING
: Thread κ° λ€λ₯Έ Thread μ μ§μ λ λκΈ°μκ°μ νΉμ μμ μ μννκΈ°κΉμ§ κΈ°λ€λ¦½λλ€.TERMIATED
: Thread μ μ€νμ μλ£νμ΅λλ€.
Multi Thread
νλμ νλ‘κ·Έλ¨μ μ¬λ¬ Thread λ‘ κ΅¬μ±νκ³ κ° Thread λ‘ νμ¬κΈ νλμ μμ μ μ²λ¦¬νλλ‘ νλ κ²
λνμ μΌλ‘ μΉ μλ²λ Multi Thread Application μ΄λ€.
- μ₯μ
- μμ€ν μμ μλͺ¨ κ°μ (μμμ ν¨μ¨μ± μ¦λ)
- μμ€ν μ²λ¦¬λ μ¦κ°
- νλ‘κ·Έλ¨λ΄μ μλ΅μκ° λ¨μΆ
- λ¨μ
- μ€κ³μ λμ΄λκ° λμμ§λ€.
- λλ²κΉ μ΄ μ΄λ ΅λ€.
- λ¨μΌ νλ‘μΈμ€ μμ€ν μ κ²½μ° ν¨κ³Όλ₯Ό κΈ°λν μ μλ€.
- λ€λ₯Έ νλ‘μΈμ€μμ μ€λ λ μ μ΄κ° μ΄λ ΅λ€.
- λμμ± λ¬Έμ κ° λ°μνλ€.
- νλμ μ€λ λλ‘ μΈν΄ μ 체μ νλ‘μΈμ€κ° μν₯μ λ°λλ€.
Multi Thread νκ²½μ μμ μμλ Therad κ°μ μμ 곡μ μ λκΈ°ν λ¬Έμ μ μ κ²½μ μ¨μΌ νλ€.
Java μμλ Multi Thread νκ²½μ λ§λ€μ΄ μ¬μ©νλ λ°©λ²μ λνμ μΌλ‘ 3κ°μ§ λ°©λ²μ λ§μ΄ μ¬μ©νλ€.
Thread Class λ₯Ό μμλ°μ μ¬μ©
Thread Class λ₯Ό μλΈν΄λμ±(subclassing) νκ³ run
Method λ₯Ό Override
νλ€.
ꡬν μμ
- Thread Class λ₯Ό μμ λ°μ λ΄κ° μν¬ μΌμ ν΄μ€ Class λ₯Ό νλ λ§λ λ€.
- μμμ λ§λ Class μ
run
Method μμ μν¬ μΌμ μ μν΄ μ€λ€. - λ©μΈ Thread μμ μμμ λ§λ Class μ
start
Method λ₯Ό νΈμΆνλ€.
λ°λμ
start
λ©μλλ‘ μ€νμ ν΄μΌ νλ€.
run
λ©μλλ₯Ό μ€ννλ©΄ λ©μΈ Thread μμ λμκ°λ―λ‘ μλ―Έκ° μλ€.
static class AddThread extends Thread {
@Override
public void run() {
int sum = 0;
for (int i = 1; i < 11; ++i) {
sum += i;
System.out.printf("Add Sum is %d\r\n", sum);
}
}
}
AddThread at = new AddThread();
at.start();
Runnable μΈν°νμ΄μ€λ₯Ό ꡬννμ¬ μ¬μ©
Runnable
μΈν°νμ΄μ€λ₯Ό ꡬννκ³ Runnable
κ°μ²΄λ₯Ό Thread μμ±μλ‘ μ λ¬νλ€.
ꡬνμμ
- μ°μ
Runnable
Interface λ₯Ό ꡬνν Class λ₯Ό νλ μμ±νλ€. - μμμ λ§λ Class μ
run
Method μ μν¬ μΌμ μ μνλ€. - ν΄λΉ Class λ₯Ό μμ±νκ³ Thread λ₯Ό μμ±ν λ μΈμλ‘ λ£μ΄μ μμ±νλ€.
- λ©μΈ Threadμμ μμμ λ§λ Class μ
start
Method λ₯Ό νΈμΆνλ€.
static class AddThreadRunnable implements Runnable {
@Override
public void run() {
int sum = 0;
for (int i = 1; i < 11; ++i) {
sum += i;
System.out.printf("Add Sum is Runnable %d\r\n", sum);
}
}
}
Runnable ar = new AddThreadRunnable();
Thread atr = new Thread(ar);
atr.start();
Thread κ° ν μΌμ run
Method μμ λ£μΌλ©΄ λλ€.
Single Thread νλ‘κ·Έλ¨μ main
Method κ° λ°νλλ©΄ μ’
λ£λκ³
Multi Thread νλ‘κ·Έλ¨μ run
Method μ μ€νμ΄ λλλ©΄ μ’
λ£λλ€.
Future, Callable, Executor
Java 5 μ΄μμμ μ§μνλ λ°©μμΌλ‘ Callback Pattern μΌλ‘ μ½κ² μ¬μ© κ°λ₯νλλ‘ νλ μ κ·Ό λ°©λ²μ΄λ€.
λ€μν μ’ λ₯μ Thread λ₯Ό μμ±ν λ€μ, μ¬λ¬ Thread λ‘ λΆν° μνλ μμλλ‘ κ°μ μ»μ΄μ¬ μ μλ€.
ꡬν μμ
- μμ
λμμ
Callable
κ°μ²΄λ₯Ό μμ±ν νExecutorService
μ λ±λ‘νλ€. - μμ
μ κ²°κ³Όλ
Future
κ°μ²΄κ° λ°ν λ°λλ€. Future
κ°μ²΄ μ¬μ© μ μ΄λ―Έ κ²°κ³Όκ° μ€λΉ λμ΄ μλ κ²½μ°μλ μ¦μ μ¬μ©νλ©°, κ·Έλ μ§ μλ κ²½μ°μλ Polling Thread λ μ€λΉκ° λ λκΉμ§ Block μνκ° λλ€.
Synchronizred
Java μμ λκΈ°ν μμμ synchronizred
ν€μλλ‘ νμλλ€.
λκΈ°νλ κ°μ²΄μ λν λκΈ°νλ‘ μ΄λ£¨μ΄μ§λλ° μ¬λ¬ Thread κ° ν κ°μ μμμ μ¬μ©νκ³ μ ν λ ν΄λΉ Thread λ§ μ μΈνκ³ λλ¨Έμ§ Thread μ μ κ·Όμ λ§λ λ°©λ²μ΄λ€.
λΈλ‘μ μ κ·Όμ μλνλ λ€λ₯Έ Thread λ€μ λΈλ‘ μμ Thread κ° μ€νμ λ§μΉκ³ λΈλ‘μ λ²μ΄λ λκΉμ§ μ°¨λ¨ (blocked) μν κ° λλ€.
λνμ μΌλ‘ Log Files κ³Ό κ°μ΄ μλ‘ λ€λ₯Έ νλ‘μΈμ€μ μ κ·Ό κ°λ₯ν 리μμ€λ₯Ό λμμΌλ‘ μ¬μ©ν λ ν¨κ³Όμ μ΄λ€.
μ΄λ¬ν λ°©μμ λ°°νμ μ κ·Ό μ΄λΌκ³ νλ€.
μ₯μ
thread-safe
νκ² μ¬μ©μ΄ κ°λ₯νμ¬ μ¬μ©μμ μλλλ‘ νλ‘κ·Έλ¨μ νλ¦ μ μ΄κ° κ°λ₯νλ€.
λ¨μ
- νλ‘κ·Έλ¨μ μ±λ₯μ νλ₯Ό μΌμΌν¬ μ μλ€.
- Java λ΄λΆμ μΌλ‘ λ©μλλ λ³μμ λκΈ°νλ₯Ό νκΈ° μν΄
block
&unblock
μ²λ¦¬λ₯Ό νκ²λλλ° μ΄λ° μ²λ¦¬λ€μ ν΅νμ¬ μλΉλλ 리μμ€κ° νλ‘κ·Έλ¨ μ λ°μ μΈ μ±λ₯μ μν₯μ μ€λ€.
- Java λ΄λΆμ μΌλ‘ λ©μλλ λ³μμ λκΈ°νλ₯Ό νκΈ° μν΄
synchronized
ν€μλλ λ€μ λ€κ°μ§ μ νμ λΈλ‘μ΄ μ°μΈλ€.
Syntax
μΈμ€ν΄μ€ λ©μλμ λκΈ°ν μ μ© (Instance Method)
νΉμ λΆλΆμ λν΄μλ§ λκΈ°νλ₯Ό λκΈ°νλ₯Ό ν νμκ° μμ κ²½μ° μλ λ©μλμ κ°μ΄
μ μΈλ¬Έμ μλ synchronized
ν€μλλ₯Ό ν΅νμ¬ λκΈ°νλ₯Ό νλ€.
public synchronized void add(int value) {
this.count += value;
}
Instance Method μ λκΈ°νλ μ΄ Method λ₯Ό κ°μ§ Instance (κ°μ²΄) λ₯Ό κΈ°μ€ μΌλ‘ νλ€.
νλμ Class κ° λκΈ°νλ Instance Method λ₯Ό κ°μ§λ©΄, λκΈ°νλ μ΄ Class μ νλμ Instance λ₯Ό κΈ°μ€μΌλ‘ μ΄λ£¨μ΄μ§λ©° ν μμ μ μ€μ§ νλμ Thread λ§μ΄ λκΈ°νλ Instance Method λ₯Ό μ€νν μ μλ€.
νλμ Instance νλμ Thread μ΄λ€.
μ μ λ©μλμ λκΈ°ν μ μ© (Static Method)
μΈμ€ν΄μ€ λ©μλμ μ¬μ©λ²κ³Ό κ°μ΄ μ μΈλ¬Έμ μλ synchronized
ν€μλλ₯Ό ν΅νμ¬ λκΈ°νλ₯Ό νλ€.
public static synchronized void add(int value) {
count += value;
}
Static Method μ λκΈ°νλ μ΄ Method λ₯Ό κ°μ§ Class (κ°μ²΄) λ₯Ό κΈ°μ€ μΌλ‘ νλ€.
JVM μμ Class κ°μ²΄λ Class λΉ νλλ§ μ‘΄μ¬ν μ μμΌλ―λ‘, κ°μ Class μ λν΄μλ μ€μ§ ν Thread μλ§ λκΈ°νλ Static Method λ₯Ό μ€νν μ μλ€.
νλμ Class λΉ νλμ Thread μ΄λ€.
μΈμ€ν΄μ€ λ©μλ μμ λκΈ°ν μ μ© (Instance Method Codeblock)
λκΈ°νλ₯Ό λ©μλ μ 체μ μ μ©νλκ²μ΄ μλ λ©μλμ νΉμ λΆλΆμ μ μ©νλκ²μ΄ ν¨μ¨μ μΌ λκ° μλ€.
public void add(int value) {
synchronized(this) {
this.count += value;
}
}
μ μ λ©μλμ μμ λκΈ°ν μ μ© (Static Method Codeblock)
Instance Method Codeblock κ³Ό μ¬μ©λ²μ λμΌνλ€.
public static void add(int value) {
synchronized(this) {
this.count += value;
}
}
Callable
1.5 vs Runnable
1.0
Callable μ Runnable μ²λΌ λ°λ‘ Thread μ μΈμλ‘ μ λ¬ λΆκ°νλ©°
ExecutorService κ°μ체 submit()
λ©μλλ₯Ό μ¬μ©νμ¬ μ λ¬νλ€. (ThreadPool μ¬μ©)
ExecutorService mPool = Executors.newFixedThreadPool(5);
Future<String> mFuture = mPool.submit(new Callable<String>() {
@Override
public String call() throws Exception {
Thread.sleep(500);
return "JustTest";
}
});
Runnable μ Callable κ³Ό λ¬λ¦¬ Thread μ λ°λ‘ μΈμλ₯Ό μ λ¬ κ°λ₯νλ€.
new Thread(new Runnable() {
@Override
public void run() {
Log.d(Tag, "Thread Test");
}
});
Callable | Runnable | |
---|---|---|
Return | Generic μΌλ‘ λ°μ νμ μ λ°ν | void |
Exception | Exception μ κ°μ§μ μλ€. | μμ |
β Method Annotation β