1. μ°λ λ
νλ‘μΈμ€μ μ°λ λ
- λͺ¨λ νλ‘μΈμ€λ μ΅μν νλμ μ°λ λλ₯Ό κ°κ³ μμ
- νλ‘μΈμ€ : μ€ν μ€μΈ νλ‘κ·Έλ¨, μμκ³Ό μ°λ λλ‘ κ΅¬μ±
- μ°λ λ : νλ‘μΈμ€ λ΄μμ μ€μ μμ
μ μν
- νλ‘μΈμ€ : μ°λ λ = 곡μ₯ : μΌκΎΌ
- μ±κΈ μ°λ λ νλ‘μΈμ€ = μμ + μ°λ λ
- λ©ν° μ°λ λ νλ‘μΈμ€ = μμ + μ°λ λ + μ°λ λ + β¦ + μ°λ λ
- βνλμ μλ‘μ΄ νλ‘μΈμ€λ₯Ό μμ±νλ κ² λ³΄λ€ νλμ μλ‘μ΄ μ°λ λλ₯Ό μμ±νλ κ²μ΄ λ μ μ λΉμ©μ΄ λ λ€.β
λ©ν°μ°λ λμ μ₯λ¨μ
- λλΆλΆμ νλ‘κ·Έλ¨μ΄ λ©ν°μ°λ λλ‘ μμ±λμ΄ μλ€. κ·Έλ¬λ, λ©ν°μ°λ λ νλ‘κ·Έλλ°μ΄ μ₯μ λ§ μλ κ²μ μλλ€.
μ₯μ
- μμ€ν
μμμ λ³΄λ€ ν¨μ¨μ μΌλ‘ μ¬μ©ν μ μμ
- μ¬μ©μμ λν μλ΅μ±μ΄ ν₯μλ¨
- μμ
μ΄ λΆλ¦¬λμ΄ μ½λκ° κ°κ²°ν΄μ§
λ¨μ
- λκΈ°νμ μ£Όμν΄μΌ ν¨
- κ΅μ°©μν(dead-lock)κ° λ°μνμ§ μλλ‘ μ£Όμν΄μΌ ν¨
- κ° μ°λ λκ° ν¨μ¨μ μΌλ‘ κ³ λ₯΄κ² μ€νλ μ μκ² ν΄μΌ ν¨
Java Thread
- μΌλ° μ€λ λμ κ±°μ μ°¨μ΄κ° μμΌλ©° JVMμ΄ μ΄μ체μ μν μ ν¨
- μλ°μλ νλ‘μΈμ€κ° μ‘΄μ¬νμ§ μκ³ μ€λ λλ§ μ‘΄μ¬
- μλ° μ€λ λλ JVMμ μν΄ μ€μΌμ€λλ μ€ν λ¨μ μ½λ λΈλ‘
- μλ° μ€λ λ μ€μΌμ€λ§μ μ μ μΌλ‘ JVMμ μν΄ μ΄λ£¨μ΄μ§
- JVMμ΄ κ΄λ¦¬νλ μ€λ λ μ 보
- μ€λ λκ° λͺ κ° μ‘΄μ¬νλμ§
- μ€λ λλ‘ μ€νλλ νλ‘κ·Έλ¨ μ½λμ λ©λͺ¨λ¦¬ μμΉλ μ΄λμΈμ§
- μ€λ λμ μνλ 무μμΈμ§
- μ€λ λμ μ°μ μμλ μΌλ§μΈμ§
- μ¦, κ°λ°μλ μλ° μ€λ λλ‘ μλν μ€λ λ μ½λλ₯Ό μμ±νκ³ , μ€λ λ μ½λκ° μλͺ
μ κ°μ§κ³ μ€νμ μμνλλ‘ JVMμ μμ²νλ μΌ λΏ
3~6. μ°λ λμ ꡬνκ³Ό μ€ν
μ°λ λμ ꡬνκ³Ό μ€ν
- Thread ν΄λμ€λ₯Ό μμ
- Runnable μΈν°νμ΄μ€λ₯Ό ꡬν (λ€λ₯Έ ν΄λμ€λ₯Ό μμ λ°μ μ μκΈ° λλ¬Έμ λ μ μ°ν¨)
Runnable r = new MyThread2();
Thread t2 = new Thread(r);
t2.start();
μ°λ λμ μ€ν - start()
- μ°λ λ μμ± ν
start()
λ₯Ό νΈμΆν΄μΌ μ°λ λκ° μμ
μ μμν¨
Thread t1 = new Thread(); // μ°λ λ t1μ μμ±
Thread t2 = new Thread(); // μ°λ λ t2μ μμ±
t1.start(); // μ°λ λ t1μ μ€ν
t2.start(); // μ°λ λ t2μ μ€ν
start()
λ₯Ό νΈμΆνλ©΄ μ€ν κ°λ₯ν μνκ° λλ κ². λ°λ‘ μ€νλμ§ μμ
- OS μ€μΌμ₯΄λ¬κ° μ€ν μμλ₯Ό κ²°μ . λ¨Όμ νΈμΆλμλ€κ³ λ¨Όμ μ€νλμ§ μμ
start()
μ run()
start()
κ° μλ‘μ΄ νΈμΆ μ€ν(Call stack)μ μμ±
- μμ±λ νΈμΆ μ€νμμ
run()
μ΄ μ€ν λ¨
7~13. μ±κΈ/λ©ν° μ°λ λ, I/O λΈλ½νΉ
main μ°λ λ
- main λ©μλμ μ½λλ₯Ό μννλ μ°λ λ
- μ°λ λλ βμ¬μ©μ μ°λ λβ μ βλ°λͺ¬ μ°λ λ(보쑰 μ°λ λ)β λ μ’
λ₯κ° μμ
- μ€ν μ€μΈ μ¬μ©μ μ°λ λκ° νλλ μμ λ νλ‘κ·Έλ¨μ μ’
λ£λλ€.
μ±κΈμ°λ λμ λ©ν°μ°λ λ
- context switching : μ°λ λμ μμ
κ° λμ΄κ°λ κ²
μ°λ λμ I/O λΈλ½νΉ
- I/O λΈλ½νΉ : μ
μΆλ ₯μ μμ
μ€λ¨ νμ
- λ©ν° μ°λ λλ μ
μΆλ ₯μ κΈ°λ€λ¦¬λ κ΅¬κ° λμ λ€λ₯Έ μ°λ λλ₯Ό μ¬μ©ν μ μμ΄ ν¨μ¨μ
14~17. μ°λ λμ μ°μ μμ, κ·Έλ£Ή
μ°λ λμ μ°μ μμ
- μμ
μ μ€μλμ λ°λΌ μ°λ λμ μ°μ μμλ₯Ό λ€λ₯΄κ² νμ¬ νΉμ μ°λ λκ° λ λ§μ μμ
μκ°μ κ°κ² ν μ μμ
- ν¬λ§μ¬νμΌ λΏ OS μ€μΌμ₯΄λ¬μ μν΄ μ°μ μμκ° μ ν΄μ§
void setPriority(int newPriority) // μ°λ λμ μ°μ μμλ₯Ό μ§μ ν κ°μΌλ‘ λ³κ²½
int getPriority() // μ°λ λμ μ°μ μμλ₯Ό λ°ν
public static final int MAX_PRIORITY = 10 // μ΅λμ°μ μμ
public static final int MIN_PRIORITY = 1 // μ΅μμ°μ μμ
public static final int NORM_PRIORITY = 5 // 보ν΅μ°μ μμ
μ°λ λ κ·Έλ£Ή
- μλ‘ κ΄λ ¨λ μ°λ λλ₯Ό κ·Έλ£ΉμΌλ‘ λ¬Άμ΄μ λ€λ£¨κΈ° μν κ²
- λͺ¨λ μ°λ λλ λ°λμ νλμ μ°λ λ κ·Έλ£Ήμ ν¬ν¨λμ΄ μμ΄μΌ ν¨
- μ°λ λ κ·Έλ£Ήμ μ§μ νμ§ μκ³ μμ±ν μ°λ λλ βmain μ°λ λ κ·Έλ£Ήβμ μν¨
- μμ μ μμ±ν μ°λ λ(λΆλͺ¨ μ°λ λ)μ κ·Έλ£Ήκ³Ό μ°μ μμλ₯Ό μμλ°μ
18~21. λ°λͺ¬ μ°λ λ, μ°λ λμ μν
λ°λͺ¬ μ°λ λ(daemon thread)
- μΌλ° μ°λ λ(non-daemon thread)μ μμ
μ λλ 보쑰μ μΈ μν μ μν
- μΌλ° μ°λ λκ° λͺ¨λ μ’
λ£λλ©΄ μλμ μΌλ‘ μ’
λ£λ¨
- κ°λΉμ§ 컬λ ν°, μλμ μ₯, νλ©΄ μλκ°±μ λ±μ μ¬μ©λ¨
- 무ν루νμ 쑰건문μ μ΄μ©ν΄μ μ€ν ν λκΈ°νλ€κ° νΉμ μ‘°κ±΄μ΄ λ§μ‘±λλ©΄ μμ
μ μννκ³ λ€μ λκΈ°νλλ‘ μμ±
public void run() {
while (true) {
try {
Thread.sleep(3 * 1000);
} catch(InterruptedException e) {}
// autoSave κ°μ΄ trueλ©΄ autoSave() νΈμΆ
if (autoSave) {
autoSave();
}
}
}
// μ°λ λκ° λ°λͺ¬μΈμ§ νμΈ
boolean isDaemon()
// μ°λ λλ₯Ό λ°λͺ¬ μ°λ λλ‘ λ³κ²½ (λ°λμ start()λ₯Ό νΈμΆνκΈ° μ μ μ€νλμ΄μΌ ν¨)
void setDaemon(boolean on)
μ°λ λμ μν
μν | μ€λͺ
|
---|
NEW | μ°λ λκ° μμ±λκ³ μμ§ start()κ° νΈμΆλμ§ μμ μν |
RUNNABLE | μ€ν μ€ λλ μ€ν κ°λ₯ν μν |
BLOCKED | λκΈ°νλΈλμ μν΄μ μΌμμ μ§λ μν(lockμ΄ ν릴 λκΉμ§ κΈ°λ€λ¦¬λ μν) |
WAITING, TIMED_WAITING | μ°λ λμ μμ
μ΄ μ’
λ£λμ§λ μμμ§λ§ μ€νκ°λ₯νμ§ μμ(unrunnable) μΌμμ μ§μν. TIMED_WAITINGμ μΌμμ μ§μκ°μ΄ μ§μ λ κ²½μ°λ₯Ό μλ―Έ |
TERMINATED | μ°λ λμ μμ
μ΄ μ’
λ£λ μν |
22~25. sleep(), interrupt()
sleep()
- νμ¬ μ°λ λ(μκΈ° μμ )λ₯Ό μ§μ λ μκ°λμ λ©μΆκ² ν¨
static void sleep(long millis)
static void sleep(long millis, int nanos)
- μμΈμ²λ¦¬λ₯Ό ν΄μΌ ν¨ (InterruptedException λ°μ μ κΉ¨μ΄λ¨)
- νΉμ μ°λ λλ₯Ό μ§μ ν΄μ λ©μΆκ² νλ κ²μ λΆκ°λ₯
interrupt()
- λκΈ°μν(WAITING)μΈ μ°λ λλ₯Ό μ€νλκΈ°μν(RUNNABLE)λ‘ λ§λ¬
void interrupt() // μ°λ λμ interrupted μνλ₯Ό false μμ true λ‘ λ³κ²½
boolean isInterrupted() // μ°λ λμ interrupted μνλ₯Ό λ°ν
static boolean interrupted() // νμ¬ μ°λ λμ interrupted μνλ₯Ό μλ €μ£Όκ³ , false λ‘ μ΄κΈ°ν
26~27. suspend(), resume(), stop()
suspend(), resume(), stop()
- μ°λ λμ μ€νμ μΌμμ μ§, μ¬κ°, μμ μ μ§ μν΄
- νμ§λ§, deprecated λ¨. κ΅μ°©μν(dead-lock)λ₯Ό μΌμΌν¬ κ°λ₯μ±μ΄ μμ΄μ κΆμ₯ X
28~29. join(), yield()
join()
- μ§μ λ μκ° λμ νΉμ μ°λ λκ° μμ
νλ κ²μ κΈ°λ€λ¦°λ€.
- μμΈμ²λ¦¬ ν΄μΌ ν¨ (InterruptedExceptionμ΄ λ°μνλ©΄ μμ
μ¬κ°)
yield()
- λ¨μ μκ°μ λ€μ μ°λ λμκ² μ보νκ³ , μμ (νμ¬ μ°λ λ)μ μ€νλκΈ°
- yield()μ interrupt()λ₯Ό μ μ ν μ¬μ© μ, μλ΅μ±κ³Ό ν¨μ¨μ±μ λμΌ μ μμ
30~33. μ°λ λμ λκΈ°ν
μ°λ λμ λκΈ°ν(synchronization)
- λ©ν° μ°λ λ νλ‘μΈμ€μμλ λ€λ₯Έ μ°λ λμ μμ
μ μν₯μ λ―ΈμΉ μ μμ
- μ§νμ€μΈ μμ
μ΄ λ€λ₯Έ μ°λ λμκ² κ°μλ°μ§ μκ² νλ €λ©΄ βλκΈ°νβκ° νμ
- μ°λ λμ λκΈ°ν - ν μ°λ λκ° μ§νμ€μΈ μμ
μ λ€λ₯Έ μ°λ λκ° κ°μνμ§ λͺ»νκ² λ§λ κ²
- λκΈ°ννλ €λ©΄ κ°μλ°μ§ μμμΌ νλ λ¬Έμ₯λ€μ βμκ³ μμβμΌλ‘ μ€μ
- μκ³ μμμ λ½μ μ»μ λ¨ νλμ μ°λ λλ§ μΆμ
κ°λ₯ (κ°μ²΄ 1κ°μ λ½ 1κ°)
synchronizedλ₯Ό μ΄μ©ν λκΈ°ν
- synchronizedλ‘ μκ³μμ(lockμ΄ κ±Έλ¦¬λ μμ)μ μ€μ νλ λ°©λ² 2κ°μ§
// 1. λ©μλ μ 체λ₯Ό μκ³ μμμΌλ‘ μ§μ
public synchronized void calcSum() {
...
}
// 2. νΉμ ν μμμ μκ³ μμμΌλ‘ μ§μ
synchronized(κ°μ²΄μ μ°Έμ‘°λ³μ) {
...
}
34~36. wait(), notify()
wait(), notify()
- λκΈ°νμ ν¨μ¨μ λμ΄κΈ° μν΄ wait(), notify()λ₯Ό μ¬μ©
- Object ν΄λμ€μ μ μλμ΄ μμΌλ©°, λκΈ°ν λΈλ‘ λ΄μμλ§ μ¬μ© κ°λ₯
wait()
- κ°μ²΄μ lockμ νκ³ μ°λ λλ₯Ό ν΄λΉ κ°μ²΄μ waiting poolμ λ£μ
notify()
- wating poolμμ λκΈ°μ€μΈ μ°λ λ μ€ νλλ₯Ό κΉ¨μ
notifyAll()
- wating poolμμ λκΈ°μ€μΈ λͺ¨λ μ°λ λλ₯Ό κΉ¨μ