# μ°λ λ(Thread)
written by sohyeon, hyemin π‘
# 1. νλ‘μΈμ€μ μ°λ λ
νλ‘μΈμ€(process)λ μ€ν μ€μΈ νλ‘κ·Έλ¨(program)
μ΄λ€.
νλ‘κ·Έλ¨μ μ€ννλ©΄ OSλ‘λΆν° μ€νμ νμν μμ(λ©λͺ¨λ¦¬)μ ν λΉλ°μ νλ‘μΈμ€κ° λλ€.
μ°λ λλ νλ‘μΈμ€μ μμμ μ΄μ©ν΄μ μ€μ λ‘ μμ
μ μννλ κ²
μ λ§νλ€.
λͺ¨λ νλ‘μΈμ€λ μ΅μν νλ μ΄μμ μ°λ λκ° μ‘΄μ¬νλ€.
μ°λ λκ° μμ μ μννλλ° κ°λ³μ μΈ λ©λͺ¨λ¦¬ 곡κ°(νΈμΆμ€ν)μ νμλ‘ νκΈ° λλ¬Έμ νλ‘μΈμ€μ λ©λͺ¨λ¦¬ νκ³μ λ°λΌ μμ±ν μ μλ μ°λ λμ μκ° κ²°μ λλ€.
# λ©ν°νμ€νΉκ³Ό λ©ν°μ°λ λ©
λ©ν°νμ€νΉ(multi-tasking)
: μ¬λ¬ κ°μ νλ‘μΈμ€κ° λμμ μ€νλ μ μλ€.
λ©ν°μ°λ λ©(multi-threading)
: νλμ νλ‘μΈμ€ λ΄μμ μ¬λ¬ μ°λ λκ° λμμ μμ
μ μννλ κ²μ΄λ€.
CPUμ μ½μ΄κ° ν λ²μ λ¨ νλμ μμ λ§ μνν μ μμΌλ―λ‘, μ€μ λ‘ λμμ μ²λ¦¬ν΄μΌνλ μ°λ λμ μλ μ½μ΄μ κ°μμ μΌμΉνλ€.
νμ§λ§, μ²λ¦¬ν΄μΌνλ μ°λ λμ μλ μΈμ λ μ½μ΄μ κ°μλ³΄λ€ ν¨μ¬ λ§κΈ° λλ¬Έμ κ° μ½μ΄κ° μμ£Ό 짧μ μκ° λμ μ¬λ¬ μμμ λ²κ°μ κ°λ©° μνν¨μΌλ‘μ¨ μ¬λ¬ μμ λ€μ΄ λͺ¨λ λμμ μνλλ κ²μ²λΌ 보μ΄κ² νλ€.
# λ©ν°μ°λ λ©μ μ₯λ¨μ
λ©ν°μ°λ λ©μ μ₯μ
- CPUμ μ¬μ©λ₯ μ ν₯μμν¨λ€.
- μμμ λ³΄λ€ ν¨μ¨μ μΌλ‘ μ¬μ©ν μ μλ€.
- μ¬μ©μμ λν μλ΅μ±μ΄ ν₯μλλ€.
- μμ
μ΄ λΆλ¦¬λμ΄ μ½λκ° κ°κ²°ν΄μ§λ€.
λ©ν°μ°λ λ©μ λ¨μ
- μ¬λ¬ μ°λ λκ° κ°μ νλ‘μΈμ€ λ΄μμ μμμ 곡μ νλ©΄μ μμ
μ νκΈ° λλ¬Έμ λκΈ°ν(synchronization), κ΅μ°©μν(deadlock) λ±μ κ³ λ €ν΄μ νλ‘κ·Έλλ°ν΄μΌνλ€.
μ¬λ¬ μ¬μ©μμκ² μλΉμ€λ₯Ό ν΄μ£Όλ μλ² νλ‘κ·Έλ¨μ κ²½μ° λ©ν°μ°λ λλ‘ μμ±νλ κ²μ νμμ μ΄μ΄μ νλμ μλ² νλ‘μΈμ€κ° μ¬λ¬ κ°μ μ°λ λλ₯Ό μμ±ν΄μ μ°λ λμ μ¬μ©μ μμ²μ΄ μΌλμΌλ‘ μ²λ¦¬
λλλ‘ νλ‘κ·Έλλ°ν΄μΌ νλ€.
# 2. μ°λ λμ ꡬνκ³Ό μ€ν
μ°λ λλ₯Ό ꡬννλ λ°©λ²μ Threadν΄λμ€λ₯Ό μμλ°λ λ°©λ²
κ³Ό RunnableμΈν°νμ΄μ€λ₯Ό ꡬννλ λ°©λ²
μ΄ μλ€.
Thread ν΄λμ€λ₯Ό μμλ°μΌλ©΄ λ€λ₯Έ ν΄λμ€λ₯Ό μμ λ°μ μ μκΈ° λλ¬Έμ, RunnableμΈν°νμ΄μ€λ₯Ό ꡬννλ λ°©λ²μ΄ μΌλ°μ μ΄λ€.
# (1) Threadν΄λμ€λ₯Ό μμ
class MyThread extends Thread {
public void run() { /* μμ
λ΄μ© */ } // Threadν΄λμ€μ run()μ μ€λ²λΌμ΄λ©
}
# (2) Runnable μΈν°νμ΄μ€λ₯Ό ꡬν
class MyThread implements Runnable {
public void run() { /* μμ
λ΄μ© */ } // Runnable μΈν°νμ΄μ€μ run()μ ꡬν
// μ¬μ¬μ©μ±(reusability)μ΄ λκ³ μ½λμ μΌκ΄μ±(consistency)μ μ μ§ν μ μμ
}
# ex) μμ
class ThreadEx1 {
public static void main(String args[]) {
ThreadEx1_1 t1 = new ThreadEx1_1(); // Threadμ μμ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μμ±
Runnable r = new ThreadEx1_2(); // Runnableμ ꡬνν ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μμ±ν λ€μ, μ΄ μΈμ€ν΄μ€λ₯Ό Threadν΄λμ€μ μμ±μμ 맀κ°λ³μλ‘ μ 곡ν΄μΌ νλ€.
Thread t2 = new Thread(r); // μμ±μ Thread(Runnable target)
t1.start();
t2.start();
}
}
class ThreadEx1_1 extends Thread {
public void run() {
for(int i=0; i<5; i++) {
System.out.println(getName()); // μ‘°μμΈ Threadμ getName()μ νΈμΆ
}
}
}
class ThreadEx1_2 implements Runnable {
public void run() {
for(int i=0; i<5; i++) {
// Thread.currentThread() - νμ¬ μ€νμ€μΈ Threadλ₯Ό λ°ννλ€.
System.out.println(Thread.currentThread().getName());
}
}
}
- Thread ν΄λμ€λ₯Ό μμλ°μΌλ©΄, μμ ν΄λμ€μμ μ‘°μμΈ Thread ν΄λμ€μ λ©μλλ₯Ό μ§μ νΈμΆν μ μμ§λ§, Runnableμ ꡬννλ©΄
Thread ν΄λμ€μ static λ©μλμΈ currentThread( )λ₯Ό νΈμΆ
νμ¬ μ°λ λμ λν μ°Έμ‘°λ₯Ό μ»μ΄ μμΌλ§ νΈμΆμ΄ κ°λ₯νλ€.
# μ°λ λμ μ€ν - start( )
μ°λ λλ₯Ό μμ±νκ³ start( )λ₯Ό νΈμΆν΄μΌλ§ μ°λ λκ° μμ±λλ€.
μ¬μ€μ start( )κ° νΈμΆλμλ€κ³ ν΄μ λ°λ‘ μ€νλλ κ²μ΄ μλλΌ, μΌλ¨ μ€νλκΈ° μνμ μλ€κ° μμ μ μ°¨λ‘κ° λμ΄μΌ μ€νλλ€.
μ€ν λκΈ°μ€μΈ μ°λ λκ° νλλ μμΌλ©΄ 곧λ°λ‘ μ€νμνκ° λλ€.
νλμ μ°λ λμ λν΄ start( )κ° ν λ²λ§ νΈμΆλ μμλ€. ν λ² μ€νμ΄ μ’ λ£λ μ°λ λλ λ€μ μ€νν μ μλ€.