βοΈ Info.
- Process, Thread νμ΅
π List.
1. νλ‘μΈμ€(Process)λ
2. μ€λ λ(Thread)λ
3. Thread ν΄λμ€μ Runnable μΈν°νμ΄μ€
4. μ€λ λμ μν
5. μ°λ λμ μ°μ μμ
6. Main μ°λ λ
7. λκΈ°ν
8. λ°λλ½
βοΈ Content.
1. νλ‘μΈμ€(Process)λ
- μ€ν μ€μΈ νλ‘κ·Έλ¨
- μ΄μ체μ μ μν΄ λ©λͺ¨λ¦¬ 곡κ°μ ν λΉλ°μ μ€ν μ€μΈ νλ‘κ·Έλ¨
- νλ‘μΈμ€λ νλ‘κ·Έλ¨μ μ¬μ©λλ λ°μ΄ν°, λ©λͺ¨λ¦¬ λ±μ μμ κ·Έλ¦¬κ³ μ€λ λ(Thread)λ‘ κ΅¬μ±λλ€
- ν κ°μ CPUμμ μ¬μ©ν μ μλ νλ‘μΈμ€λ νλμ΄λ€.
1). νλ‘μΈμ€κ° μ΄λ»κ² λμμ μ€νλλκ°?
- λ©ν° νλ‘μΈμ±(λ€μ€μ²λ¦¬)
- λ κ° μ΄μμ CPUλ₯Ό μ΄μ©νμ¬ λ€μμ νλ‘μΈμ€λ₯Ό μ²λ¦¬νλ κ²
- λ©ν° νμ€νΉ(λ€μ€ μμ
)
- κ°μ CPU λ΄μμ μ€μΌμ€λ§μ ν΅ν΄ μ¬λ¬ κ°μ νλ‘μΈμ€λ₯Ό μ²λ¦¬νλ λ°©μ
- CPUκ° λΉ λ₯Έ μλλ‘ νλ‘μΈμ€μ κ΅μ²΄λ₯Ό ν΅ν΄ λμμ μ¬λ¬ κ°μ νλ‘μΈμ€κ° μ€νλκ³ μλ€κ³ λλλ€.
2. μ€λ λ(Thread)λ
- νλ‘μΈμ€ λ΄μμ μ€μ λ‘ μμ μ¬ μννλ 주체
- λͺ¨λ νλ‘μΈμ€μλ ν κ° μ΄μμ μ€λ λκ° λ°λμ μ‘΄μ¬νλ€.
- λ κ° μ΄μμ μ€λ λλ₯Ό κ°μ§λ νλ‘μΈμ€λ₯Ό λ©ν° μ€λ λ νλ‘μΈμ€λΌ νλ€.
1). λ©ν° μ€λ λ(Multi Thread)
- νλμ νλ‘μΈμ€ λ΄μμ λ μ΄μμ μ€λ λ(Thread)κ° λμμ μμ μ μννλ κ²
- κ° μ€λ λλ μμ μ΄ μν νλ‘μΈμ€ λ©λͺ¨λ¦¬λ₯Ό 곡μ νλ€
- λ©λͺ¨λ¦¬ 곡μ λ‘ μΈν΄ μμ€ν μμμ λλΉκ° μ λ€.
- κ°κ°μ μ€λ λκ° λ³λμ μμ μ ν μ μμ΄ μ¬μ©μμμ μλ΅μ±μ΄ μ’λ€
2). λ¬Έλ§₯ κ΅ν(context switching)
μ»΄ν¨ν°μμ λμμ μ²λ¦¬ν μ μλ μ΅λ μμ μλ CPU μ½μ΄μ κ°μμ κ°λ€
CPUμ μ½μ΄μλ³΄λ€ λ λ§μ μ€λ λκ° μ€νλλ©΄, κ° μ½μ΄κ° μ ν΄μ§ μκ° λμ μ¬λ¬ μμ μ λ²κ°μκ°λ©° μννλ€.
βΆ μ΄λ κ° μ€λ λκ° μλ‘ κ΅μ²΄λ λ μ€λ λ κ°μ λ¬Έλ§₯ κ΅νμ΄ λ°μνλ€
- λ¬Έλ§₯ κ΅νμ΄λ νμ¬κΉμ§μ μμ μνλ λ€μ μμ μ νμν κ°μ’ λ°μ΄ν°λ₯Ό μ μ₯νκ³ μ½μ΄μ€λ μμ
- λ¬Έλ§₯ κ΅νμ 걸리λ μκ°μ΄ 컀μ§μλ‘, λ©ν° μ€λ λ© ν¨μ¨ μ ν
- λ§μ μμ λ¨μ κ³μ°μ μ±κΈ μ€λ λλ‘ λμνλ κ²μ΄ λ ν¨μ¨μ μΌ μ μλ€.
- λ§μ μμ μ€λ λλ₯Ό μ€ννλ κ²μ΄ νμ μ’μ μ±λ₯μ 보μ΄μ§λ μλλ€.
3). μ€λ λ κ·Έλ£Ή(thread group)
- μλ‘ κ΄λ ¨μ΄ μλ μ€λ λλ₯Ό νλμ κ·Έλ£ΉμΌλ‘ λ¬Άμ΄ λ€λ£¨κΈ° μν μ₯μΉ
- Javaμμλ μ€λ λ κ·Έλ£Ήμ λ€λ£¨κΈ° μν΄ ThreadGroup ν΄λμ€λ₯Ό μ 곡
- λ€λ₯Έ μ€λ λ κ·Έλ£Ήμ ν¬ν¨ν μ μμΌλ©°, μ΄λ¬ν μ€λ λ κ·Έλ£Ήμ νΈλ¦¬ ννλ‘ μ°κ²°λλ€
- μ€λ λλ μμ μ΄ ν¬ν¨λ μ€λ λ κ·Έλ£Ήμ΄λ νμ κ·Έλ£Ήμ μ κ·Όμ΄ κ°λ₯νμ§λ§, λ€λ₯Έ κ·Έλ£Ήμλ μ κ·Όν μ μλ€.
void threadGroup(){
// Thread Group μμ±
ThreadGroup threadGroup = new ThreadGroup("threadGroup");
// Thread μμ±μ Group μ λ¬
Thread thread = new Thread(threadGroup, "thread");
}
4). λ°λͺ¬ μ€λ λ(Daemon Thread)
- λ°λͺ¬ μ€λ λλ λ€λ₯Έ μΌλ° μ€λ λμ μμ μ λλ 보쑰μ μΈ μν μ νλ μ€λ λλ₯Ό κ°λ¦¬ν¨λ€.
- μΌλ° μ€λ λκ° μ’ λ£λλ©΄ 보쑰μν μ νλ λ°λͺ¬μ€λ λ μμ μλμΌλ‘ μ’ λ£λλ€.
- μ€λλ μμ±κ³Ό μ€νλ°©λ²μ μΌλ° μ€λ λμ κ°λ€
- λ¨, μ€ν μ setDaemon() λ©μλλ₯Ό νΈμΆνμ¬ λ°λͺ¬ μ€λ λλ‘ μ€μ νκΈ°λ§ νλ©΄ λλ€.
- μΌμ μκ°λ§λ€ μλμΌλ‘ μνλλ μ μ₯ λ° νλ©΄ κ°±μ λ±μ μ΄μ©λλ€.
void daemonThread(){
Thread thread = new Thread();
thread.setDaemon(true);
}
3. Thread ν΄λμ€μ Runnable μΈν°νμ΄μ€
Javaμμ μ€λ λλ₯Ό μμ±νλ λ°©λ²μλ λ κ°μ§κ° μλ€.
- Runnable μΈν°νμ΄μ€λ₯Ό ꡬν
- Thread ν΄λμ€λ₯Ό μμ
- λ λ°©λ² λͺ¨λ μ€λ λλ₯Ό ν΅ν΄ μμ νκ³ μ νλ λ΄μ©μ run() λ©μλμ μμ±νλ©΄ λλ€.
- Trhead ν΄λμ€λ₯Ό μμλ°μΌλ©΄ λ€λ₯Έ ν΄λμ€λ₯Ό μμλ°μ μ μμΌλ―λ‘, μΌλ°μ μΌλ‘ Runnable μΈν°νμ΄μ€λ₯Ό ꡬννλ λ°©λ²μΌλ‘ μ€λ λλ₯Ό ꡬμ±νλ€.
- Runnable μΈν°νμ΄μ€λ run()λ©μλ λ¨ νλλ§μ κ°μ§λ κ°λ¨ν μΈν°νμ΄μ€
1). Runnable
- ꡬν
public class CutomThread implements Runnable{
@Override
public void run() {
System.out.println("Implements Runnable Thread()");
}
}
- ν μ€νΈ
- Runnableμ μμ λ΄μ©μ κ°μ§κ³ μλ κ°μ²΄μ΄μ§ μ€μ μ€λ λκ° μλλ€.
- Runnableμ λ§€κ° κ°μΌλ‘ ν΄μ Thread μμ±μλ₯Ό νΈμΆνλ©΄ λΉλ‘μ μ€λ λκ° μμ±λλ€.
void runThread2(){
Runnable runnable = new CutomThread();
Thread thread = new Thread(runnable);
thread.start();
}
2). Thread
- ꡬν
class threadExtendThread extends Thread{
public void run(){
System.out.println("Extends Thread()");
}
}
- ν μ€νΈ
void runThread(){
Thread thread = new threadExtendThread();
thread.start();
}
3). run(), start()
run()
- run() λ©μλλ λ¨μν μ°λ λμ μ μΈλ ν¨μλ₯Ό μ€ννλ λ©μλμ΄λ€.
- μ€μ μ°λ λ μ€νμλ start() λ©μλλ₯Ό νΈμΆν΄μΌ νλ€.
start()
- μ€μ μ°λ λλ₯Ό νΈμΆνλ λ©μλ
- νλμ μ°λ λλ₯Ό start()λ₯Ό ν΅ν΄ νΈμΆν κ²½μ° μ¬μ¬μ© λΆκ°λ₯νλ€.
- μ¬μ¬μ© μ "IllegalThreadStateException"μ λ°μνλ€.
public static void main(String[] args) {
Thread thread = new ExtendsThread();
Thread thread1 = new Thread(new RunThread());
thread.start();
thread1.start();
//μ¬μ¬μ©
thread.start();
}
4. μ€λ λμ μν
1). μ€λ λ μ€ν
- μ€λ λ κ°μ²΄λ₯Ό μμ±νκ³ , start() λ©μλλ₯Ό νΈμΆνλ©΄ 곧λ°λ‘ μ€λ λκ° μ€νλλ κ²μ²λΌ 보μ΄μ§λ§ μ€μ λ‘λ μ€ν λκΈ° μνκ° λλ€.
- μ€ν λκΈ°μν : μ€μΌμ₯΄λ§μ΄ λμ§ μμμ μ€νμ κΈ°λ€λ¦¬κ³ μλ μν
- μ€ν λκΈ° μνμ μλ μ€λ λ μ€ μ€λ λ μ€μΌμ₯΄λ§μΌλ‘ μ νλ μ€λ λκ° λΉλ‘μ CPUλ₯Ό μ μ νκ³ run() λ©μλλ₯Ό μ€ννλ€.
- μ΄λλ₯Ό μ€ν(Running) μνλΌ νλ€.
- μ€ν μνμ μ€λ λλ run() λ©μλλ₯Ό λͺ¨λ μ€ννκΈ° μ μ μ€λ λ μ€μΌμ₯΄λ§μ μν΄ λ€μ μ€ν λκΈ° μνλ‘ λμκ° μ μλ€.
- λ€λ₯Έ μ€ν λκΈ° μνμ μλ μ€λ λκ° μ€μΌμ₯΄λ§μ μν΄ μ νλμ΄ μ€νμνλ₯Ό κ°μ Έκ°λ€
- μ€λ λλ μ€ν λκΈ° μνμ μ€ν μνλ₯Ό λ²κ°μ κ°λ©΄μ μμ μ run() λ©μλλ₯Ό μ‘°κΈμ© μ€ννλ€.
- μ€ν μνμμ run() λ©μλκ° μ’ λ£λλ©΄, λ μ΄μ μ€νν μ½λκ° μμ΄μ§κΈ° λλ¬Έμ μ€λ λμ μ€νμ λ©μΆλ€. μ΄μνλ₯Ό μ’ λ£ μνλΌ νλ€.
2). μΌμ μ μ§
- κ²½μ°μ λ°λΌ μ€λ λλ μ€ν μνμμ μ€ν λκΈ° μνλ‘ κ°μ§ μμ μλ μλ€.
- μ€ν μνμμ μΌμ μ μ§ μνλ‘ κ°κΈ°λ νλλ°, μΌμ μ μ§ μνλ μ€λ λκ° μ€νν μ μλ μνμ΄λ€.
- μΌμ μ μ§ μνμ λ€μκ³Ό κ°μ΄ μλ€.
- WAITING
- TIMED_WAITING
- BLOCKED
- μ€λ λκ° λ€μ μ€ν μνλ‘ κ°κΈ° μν΄μλ μΌμ μ μ§ μνμμ μ€ν λκΈ°μνλ‘ κ°μΌ νλ€.
3). μ€λ λ μν νμΈ
- μ€λ λμ μν μ½λλ₯Ό νμΈν μ μλλ‘ νκΈ° μν΄ Java 5λΆν° Thread ν΄λμ€μ getState() λ©μλκ° μΆκ°λμλ€.
- getState()λ©μλλ μ€λ λ μνμ λ°λΌ Thread, state μ΄κ±° μμλ₯Ό 리ν΄νλ€.
μν | μ΄κ±° μμ | μ€λͺ |
κ°μ²΄ μμ± | NEW | μ€λ λ κ°μ²΄κ° μμ±, μμ§ start() λ©μλκ° νΈμΆλμ§ μμ μν |
μ€νλκΈ° | RUNNABLE | μ€ν μνλ‘ μΈμ λ μ§ κ° μ μλ μν |
μΌμ μ μ§ | WAITING | λ€λ₯Έ μ€λ λκ° ν΅μ§ν λκΉμ§ κΈ°λ€λ¦¬λ μν |
TIMED_WAITING | μ£Όμ΄μ§ μκ° λμ κΈ°λ€λ¦¬λ μν | |
BLOCKED | μ¬μ©νκ³ μ νλ κ°μ²΄μ λ½μ΄ ν릴 λκΉμ§ κΈ°λ€λ¦¬λ μν | |
μ’ λ£ | TERMINATED | μ€νμ λ§μΉ μν |
4). μ€λ λ μν μ μ΄
λ©μλ | μ€λͺ |
interrupt() | μΌμ μ μ§ μνμ μ€λ λμμ InterruptedException μμΈλ₯Ό λ°©μμμΌ, μμΈμ²λ¦¬(catch)μ½λμμ μ€ν λκΈ° μνλ‘ κ°κ±°λ μ’ λ£ μνλ‘ κ° μ μλλ‘ νλ€. |
notify() notifyAll() |
λκΈ°ν λΈλ‘ λ΄μμ wait() λ©μλμ μν΄ μΌμ μ μ§ μνμ μλ μ€λ λλ₯Ό μ€ν λκΈ° μνλ‘ λ§λ λ€. |
resume() | suspend() λ©μλμ μν΄ μΌμ μ μ§ μνμ μλ μ€λ λλ₯Ό μ€ν λκΈ° μνλ‘ λ§λ λ€. - Deprecated (notify(), notifyAll() μ¬μ© κΆμ₯) |
sleep(long millis) sleep(long millis, int nanos) |
μ£Όμ΄μ§ μκ° λμ μ€λ λλ₯Ό μ μ§ μνλ‘ λ§λ λ€. μ£Όμ΄μ§ μκ°μ΄ μ§λλ©΄ μλμ μΌλ‘ μ€ν λκΈ° μνκ° λλ€. |
join() join(long millis) join(long millis, int nanos) |
join() λ©μλλ₯Ό νΈμΆν μ€λ λλ μΌμ μ μ§ μνκ° λλ€. μ€ν λκΈ°μνλ‘ κ°λ €λ©΄, join() λ©μλλ₯Ό λ©€λ²λ‘ κ°μ§λ μ€λ λκ° μ’ λ£λκ±°λ, 맀κ°κ°μΌλ‘ μ£Όμ΄μ§ μκ°μ΄ μ§λμΌ νλ€. |
wait() wait(long millis) wait(long millis, int nanos) |
λκΈ°ν(synchronized) λΈλ‘ λ΄μμ μ€λ λλ₯Ό μΌμ μ μ§ μνλ‘ λ§λ λ€. 맀κ°κ°μΌλ‘ μ£Όμ΄μ§ μκ°μ΄ μ§λλ©΄ μλμ μΌλ‘ μ€ν λκΈ° μνκ° λλ€. μκ°μ΄ μ£Όμ΄μ§μ§ μμ κ²½μ° notify(), notifyAll() λ©μλμ μν΄ μ€ν λκΈ° μνλ‘ κ° μ μλ€. |
suspend() | μ€λ λλ₯Ό μΌμ μ μ§ μνλ‘ λ§λ λ€. resume() λ©μλλ₯Ό νΈμΆνλ©΄ λ€μ μ€ν λκΈ° μνκ° λλ€. - Deprecated (wait() μ¬μ© κΆμ₯) |
yield() | μ€ν μ€μ μ°μ μμκ° λμΌν λ€λ₯Έ μ€λ λμκ² μ€νμ μ보νκ³ μ€ν λκΈ° μνκ° λλ€. |
stop() | μ€λ λλ₯Ό μ¦μ μ’
λ£ μν¨λ€. - Deprecated |
- Deprecated : μ¬μ© κΆμ₯νμ§ μλ λ©μλ
- wait(), notify(), notifyAll() μ Object ν΄λμ€μ λ©μλ, κ·Έ μΈλ Thread ν΄λμ€μ λ©μλμ΄λ€.
- wait(), notify(), notifyAll() μ λκΈ°ν(synchronized) λ©μλ λλ λκΈ°ν λΈλ‘ λ΄μμλ§ μ¬μ© κ°λ₯νλ€.
5. μ°λ λμ μ°μ μμ
Javaμμ κ° μ€λ λλ μ°μ μμ(priority)μ κ΄ν μμ λ§μ νλλ₯Ό κ°μ§κ³ μλ€
μ΄λ¬ν μ°μ μμμ λ°λΌ νΉμ μ€λ λκ° λ λ§μ μκ° λμ μμ μ ν μ μλλ‘ μ€μ νλ€.
νλ | μ€λͺ |
static int MAX_PRIORITY | μ€λ λκ° κ°μ§ μ μλ μ΅λ μ°μ μμλ₯Ό λͺ μ |
static int MIN_PRIORITY | μ€λ λκ° κ°μ§ μ μλ μ΅μ μ°μ μμλ₯Ό λͺ μ |
static int NORM_PRIORITY | μ€λ λκ° μμ±λ λ κ°μ§λ κΈ°λ³Έ μ°μ μμ λͺ μ |
- getPriority(), setPriority() λ©μλλ₯Ό ν΅ν΄ μ€λ λμ μ°μ μμλ₯Ό λ°ννκ±°λ λ³κ²½ν μ μλ€.
- μ°μ μμ λ²μλ 1~10κΉμ§μ΄λ€
- μ«μκ° λμμλ‘ μ°μ μμκ° λλ€
- μ°μ μμλ μ λκ°μ΄ μλ μλμ μΈ κ°
- μ°μ μμκ° 10μΈ μ€λ λκ° μ°μ μμ 1μΈ μ€λ λλ³΄λ€ 10λ°° 빨리 μνλλ κ²μ΄ μλλ€
- λ¨μ§ μ°μ μμκ° 10μΈ μ€λ λλ μ°μ μμ 1μΈ μ€λ λλ³΄λ€ μ’ λ λ§μ΄ μ€ν νμ ν¬ν¨λλ©°, μ’ λ λ§μ μμ μκ°μ ν λΉλ°λλ€
- μ€λ λμ μ°μ μμλ ν΄λΉ μ€λ λλ₯Ό μμ±ν μ€λ λμ μ°μ μμλ₯Ό μμλ°λλ€.
public void run() {
System.out.println(" == > this Thread extends Thread : " + this.getName() + " : " + Thread.currentThread().getName());
for(int i = 0; i < 10; i++){
System.out.println(Thread.currentThread().getName());
}
}
void test2(){
Thread thread = new ExtendsThread();
Thread thread1 = new ExtendsThread();
// μ°μ μμ 10 μ€μ
thread1.setPriority(10);
System.out.println(thread.getPriority());
System.out.println(thread1.getPriority());
thread.start();
thread1.start();
}
- tread, tread1μ μμ±
- tread1μ μ°μ μμλ₯Ό 10μΌλ‘ μ€μ
μ€νκ²°κ³Ό
Thread-0 : 5
Thread-1 : 10
== > this Thread extends Thread : Thread-1 : Thread-1
Thread-1
Thread-1
Thread-1
Thread-1
Thread-1
Thread-1
Thread-1
Thread-1
Thread-1
Thread-1
== > this Thread extends Thread : Thread-0 : Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
- threadμ κΈ°λ³Έ μ°μ μμλ 5λ‘ μ€μ λμ΄ μλ€.
- tread1μ μ°μ μμλ₯Ό 10μΌλ‘ μ€μ νμκΈ° λλ¬Έμ thread1μ΄ λ¨Όμ μ€νλκ³ threadκ° λμ€μ μ€νλ¨μ μ μ μλ€.
6. Main μ°λ λ
λͺ¨λ Java μ ν리μΌμ΄μ μ λ©μΈ μ€λ λκ° main() λ©μλλ₯Ό μ€ννλ©΄μ μμλλ€.
- λ©μΈ μ€λ λλ main() λ©μλμ 첫 μ½λλΆν° μλλ‘ μμ°¨μ μΌλ‘ μ€ν
- main() λ©μλμ λ§μ§λ§ μ½λλ₯Ό μ€ννκ±°λ return λ¬Έμ λ§λλ©΄ μ€ν μ’ λ£
- λ©μΈ μ€λ λλ νμμ λ°λΌ μμ
μ€λ λλ€μ λ§λ€μ΄μ λ³λ ¬λ‘ μ½λλ₯Ό μ€νν μ μλ€.
- μ¦, λ©ν° μ€λ λλ₯Ό μμ±ν΄μ λ©ν° νμ€νΉμ μννλ€.
- μ±κΈ μ€λ λ μ ν리μΌμ΄μ μμλ λ©μΈ μ€λ λκ° μ’ λ£νλ©΄ νλ‘μΈμ€κ° μ’ λ£λλ€.
- λ©ν° μ€λ λ μ ν리μΌμ΄μ
μλ μ€ν μ€μΈ μ€λ λκ° νλλΌλ μλ€λ©΄ νλ‘μΈμ€λ μ’
λ£λμ§ μλλ€.
- λ©μΈ μ€λ λκ° μμ μ€λ λλ³΄λ€ λ¨Όμ μ’ λ£λλλΌλ μμ μ€λ λκ° κ³μ μ€ν μ€μ΄λΌλ©΄ νλ‘μΈμ€λ μ’ λ£λμ§ μλλ€.
7. λκΈ°ν
λ©ν° μ€λ λ νλ‘κ·Έλ¨μμλ μ€λ λλ€μ΄ κ°μ²΄λ₯Ό 곡μ ν΄μ μμ ν΄μΌ νλ κ²½μ°κ° μλ€.
μ΄ κ²½μ°, μ€λ λ Aλ₯Ό μ¬μ©νλ κ°μ²΄κ° μ€λ λ Bμ μν΄ μνκ° λ³κ²½λ μ μκΈ° λλ¬Έμ μ€λ λ Aκ° μλνλ κ²κ³Όλ λ€λ₯Έ κ²°κ³Όλ₯Ό μ°μΆν μ μλ€.
μλ‘ μ¬λ¬ μ¬λμ΄ νλμ κ³μ°κΈ°λ₯Ό κ°μ΄ μ°λ μν©κ³Ό κ°λ€. μ¬λ Aκ° κ³μ°κΈ°λ‘ μμ νλ€ κ³μ° κ²°κ³Όλ₯Ό λ©λͺ¨λ¦¬μ μ μ₯ν λ€ μ μ μ리λ₯Ό λΉμ μ λ μ¬λ Bκ° κ³μ°κΈ°λ₯Ό λ§μ Έμ μ¬λ Aκ° λ©λͺ¨λ¦¬μ μ μ₯ν κ°μ λ€λ₯Έ κ°μΌλ‘ λ³κ²½νλ κ² κ³Όκ°λ€.
μ¬λ A, B μ€λ λ μμ±
// μ¬λ A
public class UserA extends Thread{
private Calculator calculator;
public UserA(Calculator calculator) {
this.calculator = calculator;
}
@Override
public void run() {
this.setName("μ¬λ A");
calculator.setMemory(100);
}
}
// μ¬λ B
public class UserB extends Thread{
private Calculator calculator;
public UserB(Calculator calculator) {
this.calculator = calculator;
}
@Override
public void run() {
this.setName("μ¬λ B");
calculator.setMemory(50);
}
}
//κ³μ°κΈ°
public void setMemory(int memory) {
this.memory = memory;
try {
System.out.println(Thread.currentThread().getName());
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " : " + this.memory);
}
μ€ν
void multiThread(){
Calculator calculator = new Calculator();
UserA userA = new UserA(calculator);
UserB userB = new UserB(calculator);
userA.start();
userB.start();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
κ²°κ³Ό
μ¬λ A
μ¬λ B
μ¬λ B : 50
μ¬λ A : 50
μ€λ λκ° μ¬μ© μ€μΈ κ°μ²΄λ₯Ό λ€λ₯Έ μ€λ λκ° λ³κ²½ν μ μλλ‘ νλ €λ©΄ μ€λ λ μμ μ΄ λλ λκΉμ§ κ°μ²΄μ μ κΈμ κ±Έμ΄ λ€λ₯Έ μ€λ λκ° μ¬μ©ν μμλλ‘ ν΄μΌ νλ€.
- λ©ν° μ€λ λ νλ‘κ·Έλ¨μμ λ¨ νλμ μ€λ λλ§ μ€νν μ μλ μ½λ μμμ μκ³ μμ(Critical Section)μ΄λΌ νλ€.
- Javaλ μκ³ μμμ μ§μ νκΈ° μν΄ λκΈ°ν(Synchronized) λ©μλμ λκΈ°ν λΈλ‘μ μ 곡
- μ€λ λκ° κ°μ²΄ λ΄λΆμ λκΈ°ν λ©μλ λλ λΈλ‘μ λ€μ΄κ°λ©΄ μ¦μ κ°μ²΄μ μ κΈμ κ±Έμ΄ λ€λ₯Έ μ€λ λκ° μκ³ μμ μ½λλ₯Ό μ€ννμ§ λͺ»νλλ‘ νλ€.
- λκΈ°ν λ©μλ μμ± λ°©λ²μ λ©μλ μ μΈμ synchronized ν€μλλ₯Ό λΆμ΄λ©΄ λλ€.
- synchronized ν€μλλ μΈμ€ν΄μ€μ μ μ λ©μλ μ΄λλ λΆμΌ μ μλ€.
1). synchronized λ©μλ
public synchronized void method(){
//μκ³ μμ, λ¨ νλμ μ€λ λλ§ μ€ν
}
2). synchronized μμ
public void methodFiled(){
// 곡μ κ°μ²΄ νλΌλ―Έν°,곡μ κ°μ²΄κ° μμ μ΄λ©΄ this μ¬μ© κ°λ₯
synchronized (this){
//μκ³ μμ, λ¨ νλμ μ€λ λλ§ μ€ν
}
// κ·ΈμΈ μ¬λ¬ μ€λ λκ° μ€ν κ°λ₯ν μμ
System.out.println("Thread~");
}
synchronzied μ¬μ©νμ¬ μμ κ³μ°κΈ° μμ μ μ μ©
κ³μ°κΈ° ν΄λμ€ setMemoryμ synchronzied μ μ©
public class Calculator {
int memory;
public int getMemory() {
return memory;
}
public synchronized void setMemory(int memory) {
this.memory = memory;
try {
System.out.println(Thread.currentThread().getName());
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " : " + this.memory);
}
}
μ€ν
void multiThread(){
Calculator calculator = new Calculator();
UserA userA = new UserA(calculator);
UserB userB = new UserB(calculator);
userA.start();
userB.start();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
μΆλ ₯
μ¬λ A
μ¬λ A : 100
μ¬λ B
μ¬λ B : 50
- μ¬λ A μ€λ λλ κ³μ°κΈ°(Calculator) κ°μ²΄μ λκΈ°ν λ©μλμΈ setMemory()λ₯Ό μ€ννλ μκ° Calculator κ°μ²΄λ₯Ό μ κ·Όλ€.
- λ©μΈ μ€λ λκ° μ¬λ B μ€λ λλ₯Ό μ€νμν€μ§λ§, λκΈ°ν λ©μλμΈ setMemory()λ₯Ό μ€νμν€μ§λ λͺ»νκ³ μ¬λ Aκ° setMemory() λ©μλλ₯Ό λͺ¨λ μ€νν λμ λκΈ°ν ν μ¬λ Bκ° setMemory()λ₯Ό μ¬μ©νλ€.
8. λ°λλ½
λ°λλ½( deadlock, κ΅μ°© μν) λ λ κ° μ΄μμ μμ μ΄ μλ‘ μλλ°©μ μμ μ΄ λλκΈ°λ§μ κΈ°λ€λ¦¬κ³ μλ μν.
- μλ‘ μλλ°© μμ μ΄ λλκΈ° κΈ°λ€λ¦¬κ³ μκΈ° λλ¬Έμ κ²°κ³Όμ μΌλ‘ μ무κ²λ μλ£λ μ μλ€.
- κ΅μ°©μνλ₯Ό μΌμ΄λλ €λ©΄ λ€μκ³Ό κ°μ 4κ°μ§ νμ쑰건μ μΆ©μ‘±μμΌμΌ νλ€.
- μνΈ λ°°μ (Mutual exclusion) : νλ‘μΈμ€λ€μ΄ νμλ‘ νλ μμμ λν΄ λ°°νμ μΈ ν΅μ κΆμ μꡬνλ€. ( μκ³ μμ )
- μ μ λκΈ°(Hold and wait) : νλ‘μΈμ€κ° ν λΉλ μμμ κ°μ§ μνμμ λ€λ₯Έ μμμ κΈ°λ€λ¦°λ€.
- λΉμ μ (No preemption) : νλ‘μΈμ€κ° μ΄λ€ μμμ μ¬μ©μ λλ λκΉμ§ κ·Έ μμμ λΊμ μ μλ€.
- μν λκΈ°(Circular wait) : κ° νλ‘μΈμ€λ μνμ μΌλ‘ λ€μ νλ‘μΈμ€κ° μꡬνλ μμμ κ°μ§κ³ μλ€.
- μ λ€ κ°μ§ μ‘°κ±΄μ€ ν κ°μ§λΌλ λ§μ‘±νμ§ μμΌλ©΄ κ΅μ°©μνλ λ°μνμ§ μλλ€.
- μν λκΈ° 쑰건μ μ μ λκΈ° 쑰건과 λΉμ μ 쑰건μ λ§μ‘±ν΄μΌ μ±λ¦½νλ 쑰건μΌλ‘, 4κ°μ§ 쑰건λ€μ μμ ν λ 립μ μΈ κ²μ μλλ€.
βοΈ Refer.
μΆμ²
- Process, Threadλ
http://tcpschool.com/java/java_thread_concept
https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4
- μ°λ λ μ°μ μμ
http://www.tcpschool.com/java/java_thread_concept
- λ°λλ½
https://ko.wikipedia.org/wiki/%EA%B5%90%EC%B0%A9_%EC%83%81%ED%83%9C
- κ·Έ μΈ
μ΄κ²μ΄ μλ°λ€
'Live-Study' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[12μ£Όμ°¨] μ λ Έν μ΄μ (0) | 2021.02.19 |
---|---|
[11μ£Όμ°¨] Enum (0) | 2021.02.19 |
[9μ£Όμ°¨] μμΈ μ²λ¦¬ (0) | 2021.02.19 |
[8μ£Όμ°¨] μΈν°νμ΄μ€ (0) | 2021.02.19 |
[7μ£Όμ°¨] ν¨ν€μ§ (0) | 2021.02.19 |