[ νλ‘μΈμ€μ μ€λ λ ]
1. νλ‘μΈμ€(Process)
- νμ¬ λ¨μν μ€ν μ€μΈ νλ‘κ·Έλ¨ μ체
- νλ‘μΈμ€λ νλ‘κ·Έλ¨μ μ¬μ©λλ λ°μ΄ν°, λ©λͺ¨λ¦¬ λ±μ
μμκ³Ό λλΆμ΄ μ€λ λλ‘ κ΅¬μ±λμ΄ μμ
2. μ€λ λ(Thread)
- νλ‘μΈμ€ λ΄λΆμμ μ€μ μμ μ μννλ 주체, μΌλ ¨μ μμ μ μλ―Έ
- λͺ¨λ νλ‘μΈμ€ λ΄μλ ν κ° μ΄μμ μ€λ λκ° μ‘΄μ¬νλ©° μμ μ μν
- μ΄ λ λ κ° μ΄μμ μ€λ λλ₯Ό κ°μ§ νλ‘μΈμ€λ₯Ό λ©ν°μ€λ λ νλ‘μΈμ€λΌκ³ ν¨

[ μ€λ λ ]
- μ€νμ€μΈ νλ‘κ·Έλ¨ λ΄μ μμ°¨μ μ μ΄νλ¦λ€μ μλ―Έ
- Ex) μλ° νλ‘κ·Έλ¨μ κ²½μ° main μ€λ λ → main() ν¨μ μν
finalize μ€λ λ → finalize() ν¨μ μν
- μ€λ λμ μ₯μ
β μ€λ μκ°μ΄ 걸리λ μμ μ λν μ΄ν리μΌμ΄μ μλ΅μ± ν₯μ
β μ€νμ€μΈ μμ μ·¨μ κ°λ₯
β λ³λ ¬ νλ‘κ·Έλλ° μ§μ
β DB μ²λ¦¬ λͺ¨λν°λ§
β GUI μ²λ¦¬
- μ€λ λμ λ¨μ
β λ©λͺ¨λ¦¬ μ¬μ©λ μ¦κ°
β λμμμ μΌλ‘ μΈν λ¬Έμ λ°μ κ°λ₯μ±(λ°λλ½, 무ν 루ν λ±)
[ μ€λ λμ μλͺ μ£ΌκΈ° ]
1. New
β μ€λ λ κ°μ²΄ μμ±
β start() λ©μλ λ―ΈνΈμΆ μν
2. Runnable
β μ€λ λ μ€ν λκΈ° μν
β μ€ν μνλ‘ μΈμ λ μ§ κ° μ μλ μν
β μ€λ λ κ°μ²΄ μμ± ν start() λ©μλ νΈμΆ μ Runnable μνλ‘ μ΄λ
3. Running
β μ€λ λ μ€ν μν
β Runnable μνμμ run() λ©μλ νΈμΆ μ Running μνλ‘ μ΄λ
4. Blocked
β μ€λ λ μΌμ μ μ§ μν
β μ€λ λκ° νΉμ ν μ΄μ λ‘ Running μνμμ Blockedλ‘ μν μ΄λ
5. Dead
β μ€λ λ μ’ λ£ μν


[ μ€λ λμ μμ± λ° μ€ν ]
1. Thread ν΄λμ€ μμ
- μ€λ λ μμ± → start() → run()
- run() λ©μλλ μ€λ²λΌμ΄λ© νμ
- Thread ν΄λμ€ λ©€λ² μ¬μ© κ°λ₯
2. Runnable μΈν°νμ΄μ€ ꡬν
- λ°λμ run() λ©μλλ₯Ό μ€λ²λΌμ΄λ© ν΄μΌν¨
- Thread ν΄λμ€ λ©€λ² μ¬μ© λΆκ°
- static λ©μλμΈ sleep() λ©μλλ μ¬μ© κ°λ₯
// Thread ν΄λμ€λ₯Ό μμλ°μ μμ± λ° μ μΈ
class MyClass extends Thread{
@Override
public void run() {
for(int i=0; i<10; i++) {
System.out.println("μ€λ λ[" + Thread.currentThread().getId() + "] " + i);
} try {
Thread.sleep(1000);
} catch(InterruptedException e){
e.printStackTrace();
}
super.run();
}
}
public class ThreadTest01 {
public static void main(String[] args) {
MyClass mc = new MyClass();
mc.start();
MyClass mc2 = new MyClass();
mc2.start();
}
}
/* [μΆλ ₯κ²°κ³Ό]
μ€λ λ[13] 0
μ€λ λ[14] 0
μ€λ λ[13] 1
μ€λ λ[14] 1
...
μ€λ λ[13] 8
μ€λ λ[14] 8
μ€λ λ[13] 9
μ€λ λ[14] 9
*/
// Runnable μΈν°νμ΄μ€ ꡬνμ ν΅ν μμ± λ° μ μΈ
class MyClass implements Runnable{
@Override
public void run() {
for(int i=0; i<10; i++) {
System.out.println("μ€λ λ[" + Thread.currentThread().getId() + "] " + i);
} try {
Thread.sleep(1000);
} catch(InterruptedException e){
e.printStackTrace();
}
}
}
public class ThreadTest01 {
public static void main(String[] args) {
/* Runnable μΈν°νμ΄μ€μ run() λ©μλλ₯Ό μ€λ²λΌμ΄λ©ν
* MyClass() ν΄λμ€λ₯Ό Thread ν΄λμ€μ λ§€κ°λ³μλ‘ μ½μ
*/
Thread t1 = new Thread(new MyClass());
t1.start();
Thread t2 = new Thread(new MyClass());
t2.start();
}
}
/* [μΆλ ₯κ²°κ³Ό]
μ€λ λ[13] 0
μ€λ λ[14] 0
μ€λ λ[13] 1
μ€λ λ[14] 1
...
μ€λ λ[13] 8
μ€λ λ[14] 8
μ€λ λ[13] 9
μ€λ λ[14] 9
*/
[ λ©ν° νλ‘μΈμ€, λ©ν° νμ€ν¬, λ©ν° μ€λ λ ]
1. λ©ν° νλ‘μΈμ€ (Multi -Process)
- μ¬λ¬ κ°μ CPUμμ λμμ μ¬λ¬ κ°μ νλ‘μΈμ€ μν
2. λ©ν° νμ€ν¬ (Multi-Tasking)
- νλμ CPUμμ λμμ λ μ΄μμ μμ μ μν
3. λ©ν° μ€λ λ (Multi-Thread)
- νλμ νλ‘μΈμ€ λ΄μμ μ¬λ¬ κ°μ μ€λ λκ° μμ μ μν
- λ©ν° νλ‘μΈμ€λ κ° νλ‘μΈμ€κ° λ 립μ μΈ λ©λͺ¨λ¦¬λ₯Ό ν΅ν΄ λ³λ μ€ννμ§λ§,
λ©ν° μ€λ λμ κ²½μ° μμ μ΄ μν νλ‘μΈμ€μ λ©λͺ¨λ¦¬λ₯Ό 곡μ ν¨.

[ λ©ν° μ€λ λμ λ¨μ ]
- μ¬λ¬κ°μ μ€λ λκ° νλμ μμμ λμμ μ¬μ©ν λ λ°μ
β μλ£λ₯Ό λμμ μμ²ν λ bottleneck νμ λ°μ
β λμμ¬μ©κ³Ό λ³λͺ©νμμΌλ‘ deadlock λ°μ
β λ°μ΄ν°μ 무결μ±μ λν λ¬Έμ λ°μ
- μ΄λ¬ν λ¬Έμ μ μ μλ£μ μΈ μΈ‘λ©΄μμ ν΄κ²°
1. μμ€ν μ λκΈ° λΆμ¬ → λκΈ°ν(synchronized)
2. νλ‘κ·Έλλ¨Έ μ§μ μ μ΄ → ν¨μ¨μ μ μ΄λ₯Ό μν wait(), notify() λ©μλ μ¬μ©


public class ThreadTest01{
private static int count=0;
private static synchronized void inccount() {
count++;
}
public static void main(String[] args) {
// -- μ΅λͺ
ν΄λμ€ ννλ‘ Thread κ°μ²΄ μμ± --
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for(int i=0; i<10000; i++)
inccount();
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
for(int i=0; i<10000; i++)
inccount();
}
});
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println("value : " + count);
}
}
/* [μΆλ ₯κ²°κ³Ό]
value : 20000
*/