π€²π» μ€λ λ Thread
- νλμ μ½λ μ€ν νλ¦
π λ©ν° μ€λ λ Multi-Thread
- νλμ νλ‘μΈμ€κ° λ κ°μ§ μ΄μμ μμ μ μ²λ¦¬νλ μ€λ λ
- νλ‘μΈμ€ ? λμνκ³ μλ νλ‘κ·Έλ¨
- νλ‘κ·Έλ¨ λ΄λΆμμμ λ©ν° νμ€νΉ
- λ©μΈ μ€λ λκ° μλ€λ©΄ λ©ν°μ€λ λκ° λμ¬ μ μμ
π λ©μΈ μ€λ λ Main-Thread
- main() λ©μλλ₯Ό μ€ννλ©΄μ μμλ¨
- main()λ©μλμ 첫 μ½λλΆν° μμ°¨μ μΌλ‘ μ€ννκ³ λ§μ§λ§ μ½λλ₯Ό μ€ννκ±°λ returnλ¬Έ λ§λλ©΄ μ’ λ£λ¨
- λ©ν° μ€λ λλ₯Ό μμ±νμ¬ λ©ν° νμ€νΉ μν κ°λ₯
- μμ μ€ νμμ λ°λΌ μ€λ λλ€μ λ§λ€μ΄ λ³λ ¬λ‘ μ½λ μ€ν κ°λ₯
π‘ ExecutorService λΌμ΄λΈλ¬λ¦¬
- λ³λ ¬ μμ μ μ¬λ¬ κ°μ μμ μ ν¨μ¨μ μΌλ‘ μ²λ¦¬νκΈ° μν΄ μ 곡λλ λΌμ΄λΈλ¬λ¦¬
- κ°κ° λ€λ₯Έ threadλ₯Ό μμ±νμ¬ μμ μ μ²λ¦¬νκ³ μ²λ¦¬κ° μλ£λλ©΄ ν΄λΉ threadλ₯Ό μ κ±°νλ μμ μ μ§ν
ππ» Thread μμ±κ³Ό μ€ν
π μμ μ€λ λ μμ±
- λͺ κ°μ μμ μ μ€νν μ§ κ²°μ νκ³ κ° μμ λ³λ‘ μ€λ λ μμ±
→ λ©μΈμ λ°λμ μ‘΄μ¬νκΈ° λλ¬Έμ μΆκ°μ μΈ λ³λ ¬ μμ μλ§νΌ μ€λ λ μμ±
→ μμ μ€λ λλ κ°μ²΄λ‘ μμ±λκΈ° λλ¬Έμ μΆκ°μ μΈ ν΄λμ€ νμ
βͺοΈ Thread ν΄λμ€λ‘λΆν° μ§μ μμ±
β μ€λ λ κ°μ²΄ μμ±
Thread thread = new Thread(Runnable target);
- java.lang.Thread ν΄λμ€λ‘λΆν° μμ μ€λ λ κ°μ²΄λ₯Ό μ§μ μμ±νλ €λ©΄ Runnableμ λ§€κ°λ³μλ‘ κ°λ μμ±μ νΈμΆμ΄ νμ
β‘ Runnable λ§€κ°λ³μλ‘ μμ±μ νΈμΆ
class Task implements Runnable({
public void run(){
μ€νν μ½λ;
}
}
π‘ Runnable
- μμ μ€λ λκ° μ€νν μ μλ μ½λλ₯Ό κ°μ§ μΈν°νμ΄μ€ νμ μΌλ‘ ꡬν κ°μ²΄λ₯Ό λ§λ€μ΄ λμ ν΄μΌ ν¨
- λ©μλ run( )μ΄ μ μλμ΄μμ → run ( )μ μ¬μ μ νμ¬ μ€νν μ½λ μμ±
- μ€μ μ€λ λκ° μλλΌ μμ λ΄μ©μ κ°μ§κ³ μλ κ°μ²΄μΌ λΏ !
Runnable task = new Task();
Thread thread = new Thread(task);
- Runnable ꡬν κ°μ²΄λ₯Ό μμ±ν ν μ΄κ²μ λ§€κ° κ°μΌλ‘ Thread μμ±μ νΈμΆνλ©΄ → μμ μ€λ λ μμ± !
π‘ Runnable μ΅λͺ κ°μ²΄λ₯Ό λ§€κ°λ³μλ‘ μ¬μ©
Thread thread = new Thread(new Runnable() {
public void run(){
μ€νν μ½λ;
}
});
π‘ λλ€μμ λ§€κ°λ³μλ‘ μ¬μ©
Thread thread = new Thread( () -> {
μ€νν μ½λ;
});
β’ start( ) λ©μλ νΈμΆ
- μμ μ€λ λλ μμ±μ΄ λλλΌλ start( )λ₯Ό νΈμΆν΄μΌλ§ μ€ν
- start( )κ° νΈμΆλλ©΄ μμ μ€λ λλ λ§€κ°λ³μλ‘ λ°μ Runnableμ run( )μ μ€ννλ©° μμ μ²λ¦¬
βͺοΈ Thread νμ ν΄λμ€λ‘λΆν° μμ± (μμ)
β μ€λ λ κ°μ²΄ μμ±
public class Target extends Thread {
@Override
public void run() {
μ€νμ½λ;
}
}
- Threadμ νμν΄λμ€λ‘ μμ μ€λ λλ₯Ό μ μ
- μμ ν run( )μ μ¬μ μνμ¬ μ€λ λκ° μ€νν μ½λ μμ±
β‘ μ€λ λ κ°μ²΄
Thread thread = new Target();
π‘Thread μ΅λͺ κ°μ²΄λ‘ μμ μ€λ λ κ°μ²΄ μμ±
Thread thread = new Thread() {
public void run() {
μ€νν μ½λ;
}
}
β’ start( ) λ©μλ νΈμΆ
thread.start();
π μ€λ λμ μ΄λ¦
thread.setName("μ€λ λ μ΄λ¦");
thread.getName();
- Threadμ μΈμ€ν΄μ€ λ©μλ → μ€λ λ κ°μ²΄ μ°Έμ‘° νμ
π‘ currentThread( )
: νμ¬ μ€ν μ€μ΄ μ€λ λ κ°μ²΄ 리ν΄
ππ» Thread λκΈ°ν λ° μν
π λκΈ°ν λ©μλμ λκΈ°ν λΈλ‘
(1) λ©μλμ μ¬μ©
public synchronized void method() { }
(2) κ°μ²΄μ μ¬μ©
private Objcet obj = new Object();
public void Method(){synchronized(obj){}}
- μκ³μμμ μ§μ νμ¬ λ©ν° μ€λ λμ λ°μ΄ν° μμ μ±κ³Ό μ λ’°μ±μ 보μ₯
- μ±κΈ μ€λ λμ λ¬λ¦¬ λ©ν° μ€λ λλ μμ 곡κ°μ μ€λ λ€λΌλ¦¬ 곡μ ν¨
- μ€λ λκ° μ¬μ©μ€μΈ κ°μ²΄λ₯Ό λ€λ₯Έ μ€λ λκ° λ³κ²½ν μ μλλ‘ νλ €λ©΄ μμ μ΄ μ’ λ£λ λκΉμ§ κ°μ²΄μ μ κΈμ κ±Έμ΄λμ΄μΌ ν¨
* μκ³μμ : λ©ν° μ€λ λμμ λ¨ νλμ μ€λ λλ§ μ€νν μ μλ μμ
π μ€λ λμ μν
π‘ getState( )
- μ€λ λμ μνλ₯Ό μ μ μλλ‘ ν΄μ£Όλ λ©μλ
π μ€λ λ μν μ μ΄
- μ€ν μ€μ΄ μ€λ λ μνλ₯Ό λ³κ²½νλ κ²
β yiled( ) : μ보
- μ°μ μμκ° λμΌν μ€ν μ€μΈ μ€λ λκ° λ€λ₯Έ μ€λ λμκ² μ보νκ³ μ€ν λκΈ° μνλ‘ μ΄λ
- μ€λ λκ° μμ μ μ²λ¦¬ν λ 무μλ―Έν λ°λ³΅μ λ€λ₯Έ μ€λ λμ μ보νμ¬ μ±λ₯ κ°μ
β‘ sleep( ) : μΌμ μ μ§
- μ£Όμ΄μ§ μκ° λμ μ€λ λλ₯Ό μΌμ μ μ§ μνλ‘ λ§λ¦
- μκ°μ΄ μ§λλ©΄ μλμ μΌλ‘ μ€ν λκΈ° μνλ‘ μ΄λ
try{
Thread.sleep(3000);
} catch (InterruptedException e){
}
- λ§€κ° κ°μΌλ‘λ μΌλ§λ μ μ§μνμ μμμ§ λ°λ¦¬μΈμ»¨λ λ¨μμ μκ° (1000 = 1μ΄)
- μ£Όμ΄μ§ μκ° μ interrupt( )κ° νΈμΆλλ©΄ interrupt μμΈκ° λ°μνκΈ° λλ¬Έμ μμΈμ²λ¦¬ νμν¨
β’ join( ) : κΈ°λ€λ¦Ό
[Thread A]
threadB.start(); -----> ThreadBκ° μ€νλκ³
threadB.join(); -----> ThreadAλ μΌμμ μ§
- μΌμ μ μ§ μνκ° λ¨
- λ©μλλ₯Ό λ©€λ²λ‘ κ°μ§λ μ€λ λκ° μ’ λ£λκ±°λ λ§€κ°κ°μΌλ‘ μ£Όμ΄μ§ μκ°μ΄ μ’ λ£λλ©΄ μ€νλκΈ° μνλ‘ μ΄λ
β£ wait( ) : νμ
- λκΈ°ν λΈλ‘ λ΄μμ μ€λ λλ₯Ό μΌμ μ μ§ μνλ‘ λ§λ¦
- λ§€κ°κ°μΌλ‘ μ£Όμ΄μ§ μκ°μ΄ μ§λλ©΄ μλμΌλ‘ μ€ν λκΈ° μν μ΄λ
- μ£Όμ΄μ§ μκ°μ΄ μμ λ notify, notifyAll νμ©
β€ notify( ) / notifyAll( ) : νμ
- wait( )μ μν΄ μΌμ μ μ§ μνμ μλ μ€λ λλ₯Ό μ€ν λκΈ° μνλ‘ μ΄λ
- notify( )λ waitμ μν΄ μΌμμ μ§λ μ€λ λ μ€ ν κ°λ₯Ό μ€ν λκΈ° μνλ‘ λ§λ¦
- notifyAll( )μ μΌμμ μ§λ λͺ¨λ μ€λ λλ₯Ό μ€ν λκΈ° μνλ‘ λ§λ¦
- wait, notify, notifyAllμ λͺ¨λ Objectν΄λμ€λΌ λͺ¨λ 곡μ κ°μ²΄μμ νΈμΆμ΄ κ°λ₯ν¨
→ but λκΈ°ν λ©μλ / λΈλ‘ λ΄μμλ§ μ¬μ© κ°λ₯
β₯ interrupt
ππ» Thread ν
- μ€λ λμ 무λΆλ³ν μ¦κ°λ₯Ό λ°©μ§νκΈ° μν΄ μ€λ λ ν μ¬μ©
- μμ μ μ¬μ©λλ μ€λ λμ μλ₯Ό 미리 μ ν΄λμ λμμ μμ μν
- μ ν리μΌμ΄μ μμ μ΄ νλ‘ λ€μ΄μ€λ©΄ μ€λ λ ν μμ μ€λ λλ€μ΄ νλμ© μμ μ΄ λλλ©΄ μλ‘μ΄ μμ μ λ§‘μΌλ©° μ²λ¦¬
π μ€λ λν μμ±
β newCachedThreadPool( )
- μ΄κΈ° μ€λ λ μ : 0
- μ½μ΄ μ€λ λ μ : 0
- μ΅λ μ€λ λ μ : integer.Max_value
β‘ newFixedThreadPool(int num)
- μ΄κΈ° μ€λ λ μ : 0
- μ½μ΄ μ€λ λ μ : num
- μ΅λ μ€λ λ μ : num
π μ€λ λν μ’ λ£
β shutdown( )
- νμ λ¨μμλ λͺ¨λ μμ μ μ²λ¦¬νκ³ μ’ λ£
β‘ shutdownNow( )
- λ¨μμλ μμ κ³Ό μκ΄μμ΄ μ’ λ£
- μ²λ¦¬ λͺ»ν μμ λͺ©λ‘μ λ¦¬ν΄ = Runnable μνλ€μ μμ 리ν΄
β’ awaitTermination( )
- shotdown( ) νΈμΆ ν λͺ¨λ μμ μ²λ¦¬λ₯Ό timeout μκ° μμ μ²λ¦¬νλ©΄ true
- μ²λ¦¬νμ§ λͺ»νλ©΄ μμ μ€λ λλ€μ interrupt( )νκ³ false
'Study > Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[TIL] μ¬κ·ν¨μ (0) | 2022.05.24 |
---|---|
[TIL] μλ° κ°μ λ¨Έμ (0) | 2022.05.22 |
[TIL] νμΌ μ μΆλ ₯ (0) | 2022.05.21 |
[TIL] μ€νΈλ¦Ό (0) | 2022.05.21 |
[TIL] λλ€ (0) | 2022.05.20 |