β 1. νλ‘μΈμ€μ μ€λ λ κ°λ
(1) νλ‘μΈμ€
- νλ‘κ·Έλ¨μ ν΅μμ μ€ν λ¨μλ₯Ό μλ―Ένλ©°, μ½κ²λ§ν΄ νλ‘κ·Έλ¨ νλλ₯Ό μ€ννλ©΄ μ€ν λ¨μλ₯Ό νλ‘μΈμ€λΌκ³ λΆλ₯Έλ€.
- μ¦, Javaλ νλ‘κ·Έλ¨μ΄κΈ° λλ¬Έμ μ€νμ νλ©΄ νλμ νλ‘μΈμ€λ‘ λ§λ€μ΄μ Έμ μ€νμ νκ² λλ€.
- νλ‘μΈμ€λ‘ ꡬλΆνλ μ΄μ λ, μ¬λ¬ νλ‘κ·Έλ¨μ ν¨κ» λ리기 μν΄ νλ‘μΈμ€ λ¨μλ‘ κ΅¬λΆμ νλ κ²μ΄λ€.
- νλ‘κ·Έλ¨μ΄ μ€νμ΄ λλ©΄ νλ‘μΈμκ° λλλ°, CPUλ μ¬λ¬ νλ‘μΈμ€λ₯Ό λλ¦Ό μ΄κ±Έ λ©ν°ν μ€νΉμ΄λΌκ³ ν¨.
(2) μ€λ λ
- νλ‘μΈμ€ λ΄μ μ‘΄μ¬νλ μκ·λͺ¨ μ€ν νλ¦μ μλ―Ένλ€.
- νλμ νλ‘μΈμ€ λ΄μ μ¬λ¬ μ€λ λκ° λμμ μ€νμ΄ λ μ μμ.
- νλμ νλ‘μΈμμμλ μ¬λ¬ μ€λ λκ° λ§λ€μ΄μ§ μ μμΌλ©°, νλ‘μΈμκ° ν λΉλ°μ μμμ μ€λ λκ° κ³΅μ λ°μ.
- μλ°λ νλμ νλ‘μΈμ€κ° μμμ ν λΉλ°μ νλμ κΈ°λ³Έ μ€λ λκ° λν΄νΈλ‘ μμ μ μνν¨.
- μ½κ²λ§ν΄, κΈ°λ³Έμ μΌλ‘ νλμ μ€λ λλ₯Ό μ§μν΄μ£Όλλ°, κ·Έκ²μ΄ main() λ©μλλ₯Ό μ€ννλ λ©μΈ μ€λ λμ΄λ€.
- μ¦, λ¨μΌ μ€λ λλ‘ κΈ°λ³Έμ μΌλ‘ λμμ νλ κ²μ΄λ€. ( μΆκ°μ μΌλ‘ μ€λ λλ₯Ό λ§λ€μ΄μ λ©ν° μ€λ λ νλ‘κ·Έλλ° κ°λ₯ )
- νλμ νλ‘μΈμ€ λ΄μ μ¬λ¬ μ€λ λκ° λ§λ€μ΄μ Έμ λμμ μ€νλ μ μμ, κ·Έλμ μ€λ λλ₯Ό κ²½λ νλ‘μΈμ€ λΌκ³ λΆλ¦
β 2. λ©ν° μ€λ λ κ°λ
- νλμ νλ‘μΈμ€ λ΄μμ λμ μ€νμ μν΄ μ‘΄μ¬νλ μ¬λ¬ μ€λ λλ₯Ό μλ―Ένλ€.
- Java νλ‘κ·Έλ¨μ νλμ μ€λ λμΈ main μ€λ λλ‘ μμμ΄ λλ€.
- main μ€λ λμμ μμ μ€λ λλ₯Ό λ§λ€κ³ μμμ μν¬ μ μμ.
- μ€λ λλ§λ€ μ¬λ¬ μ€λ λκ° λμμ λκΉμ μΌλ‘ μ€νμ΄λκ³ μ’ λ£κ° λ¨.
- μ½κ²λ§ν΄, main μ€λ λμΈ main() λ©μλ νλ¦μμ μ€λ λλ₯Ό λ§λ€μ΄μ λ°λ‘ λμμ νκ² λ§λ€ μ μμ.
β 3. μλ° Thread ν΄λμ€
- μλ°μμλ κΈ°λ³Έμ μΌλ‘ java.lang ν¨ν€μ§μ Thread ν΄λμ€λ₯Ό ν΅ν΄ μ€λ λ μμ±κ΄ κ΄λ¦¬λ₯Ό μν λ©μλλ₯Ό μ 곡ν΄μ€λ€.
- μλ°μμ λ 립μ μΌλ‘ μ€νλλ μμ λ¨μμΈ μ€λ λλ₯Ό ꡬννλ λ°©λ²μ ν΄λΉ Thread ν΄λμ€λ₯Ό μμ±νλ κ²μ΄λ€.
(1) Thread ν΄λμ€ μμ± λ°©λ²
[1] Thread() λ°©μ
Thread t = new Thread() {
@Override
public void run() {
System.out.println("κΈ°λ³Έ μμ±μλ‘ μ€ν");
}
};
t.start();
- μλ¬΄λ° μΈμλ μλ κΈ°λ³Έ μμ±μλ‘, μ€νν Runnable, μ€λ λ μ΄λ¦λ μ ν΄μ§μ§ μκ³ λ§λλ λ°©μ
- μ΄λ¦μ΄ λν΄νΈλ‘ Thread-n μΌλ‘ λ€μ΄κ°λ©°, run() λ©μλλ₯Ό μ€λ²λΌμ΄λ©νκ±°λ, νμ ν΄λμ€μμ ꡬνμ ν΄μ€μΌν¨.
[2] Thread(String name) λ°©μ
Thread t = new Thread("MyThread") {
@Override
public void run() {
System.out.println("μ€λ λ μ΄λ¦: " + getName());
}
};
t.start();
- μ€λ λ μ΄λ¦λ§ μ§μ νλ μμ±μ, run()μ μ€λ²λΌμ΄λ©ν΄μ ꡬννκ±°λ νμ ν΄λμ€μμ ꡬνν΄μ€μΌν¨.
[3] Thread(Runnable target) λ°©μ
Runnable task = () -> System.out.println("Runnableλ‘ μ€ν");
Thread t = new Thread(task);
t.start();
- μ€νν Runnable κ°μ²΄λ₯Ό λ겨μ μ€νν μμ μ μ€μ νλ λ°©μμ΄λ€.
- μ€λ λ μ΄λ¦ μ€μ μ μν΄μ μλμΌλ‘ μ§μ λμ§λ§, Runnableμ ν΅ν΄ μμ μ λΆλ¦¬ν μ μμ΄ μ μ°μ±μ΄ λμ.
- μ¦, run() λ©μλλ₯Ό μ€λ²λΌμ΄λ©νκ±°λ μ§μ ꡬνν νμκ°μμ. μ΄μ λ Runnable λλ€λ‘ μμ μ λ§λ€μ΄ λ¨κΈ° λλ¬Έ
[4] Thread(Runnable target, String name) λ°©μ
Runnable task = () -> System.out.println("Runnable + μ΄λ¦μΌλ‘ μ€ν");
Thread t = new Thread(task, "Worker-1");
t.start();
System.out.println("μ€λ λ μ΄λ¦: " + t.getName());
- Runnable κ°μ²΄μ μ€λ λ μ΄λ¦μ λμμ μ§μ νλ λ°©μμ΄λ€.
- μμ λ΄μ©κ³Ό μλ³μ λμμ λͺ νν ν μ μμ΄ κ°μ₯ μμ£Ό μ°μ΄λ μμ±μ μ€ νλμ΄λ€.
[5] κ²°λ‘
- κ²°λ‘ μ run() λ©μλκ° νμ μμμ΄λ©°, μ€λ λλ start() λ©μλλ‘ μ€νμ΄ λ¨.
(2) Thread ν΄λμ€ μ£Όμ λ©μλ
- void start(): run() λ©μλλ₯Ό νΈμΆνμ¬ this μ€λ λλ₯Ό μ€νμ μμΌμ£Όλ λ©μλ
- String getName(): this μ€λ λμ μ΄λ¦μ 리ν΄ν΄μ€.
- void setName(String name): this μ€λ λμ μ΄λ¦μ nameμΌλ‘ λ³κ²½
- int getPriority(): this μ€λ λμ μ°μ μμλ₯Ό 리ν΄
- void setPriority(int newPriority): this μ€λ λμ μ°μ μμλ₯Ό newPriorityλ‘ λ³κ²½
β 4. λ©ν° μ€λ λμ μ€ν
- μλ° νλ‘κ·Έλ¨μ μ€ννλ©΄ λν΄νΈλ‘ μ 곡ν΄μ£Όλ μ€λ λ 1κ°κ° μμΌλ©° ν΄λΉ μ€λ λκ° main() ν¨μλ₯Ό μ€νμ ν΄μ€.
- μ°Έκ³ λ‘ main μ€λ λλ₯Ό ν¬ν¨ν΄ λͺ¨λ μ€λ λλ λκ° μΈμ λ¨Όμ λλ μ§λ μ€μΌμ€λ¬μ μν΄ λλ€ μ²λΌ μ’ λ£κ° λ¨.
- μ½κ²λ§ν΄, μλ° μ ν리μΌμ΄μ μ λͺ¨λ μ¬μ©μ μ€λ λκ° μ’ λ£λμ΄μΌ JVMμ΄ μμ ν μ’ λ£κ° λλ€.
- main μ€λ λκ° μ’ λ£λλλΌλ, λ€λ₯Έ μ€λ λκ° μ΄μμμΌλ©΄ νλ‘κ·Έλ¨μ κ³μ μ€νμ΄ λλ€λ μλ―Έμ΄λ€.
- λ¨, μ°λ¦¬κ° λ§λ μ€λ λκ° "λ°λͺ¬ μ€λ λ"κ° μλ κ²½μ°μ νν΄μ μ΄λ€.
- λ°λͺ¬μ€λ λλ λ€λ₯Έ μΌλ° μ€λ λκ° λλμ JVMμ΄ μ’ λ£λλ©΄ μλμΌλ‘ κ°μ μ’ λ£κ° λλ€.
- λ€λ§ μ°Έκ³ μ¬νμΌλ‘λ main μ€λ λμ μμμΌλ‘ λ€λ₯Έ μ€λ λκ° μμμ΄ λ¨. μ’ λ£λ κ°κ° λλ€μ.
- λ©ν° μ€λ λ νλ‘κ·Έλ¨μ μ€ν κ²°κ³Όλ μμΈ‘ν μ μμΌλ©°, μ€ν κ²°κ³Όκ° λ§€λ² λ€λ₯Ό μ μμ.
- κ° μ€λ λλ μ ν΄μ§ μμ μμ΄ λ 립μ μΌλ‘ μ€νμ΄ λ¨ ( μ€μΌμ€λ¬μ μν΄ )
- main μ€λ λλ λ€λ₯Έ μ€λ λλ₯Ό μμμν€λ, λ€λ₯Έ μ€λ λμ μ€νκ³Ό 무κ΄νκ² μ€νλκ³ μ’ λ£κ° λλ€.
β 5. μ€λ λμ μ μ΄
- μ€λ λλ μ€λ λμ μ¬λ¬ λ©μλμ ν€μλλ₯Ό ν΅ν΄ μ μ΄λ₯Ό ν μ μλ€.
- μ½κ²λ§ν΄, μ€λ λ ν΄λμ€μμ μ¬λ¬ λ©μλλ₯Ό μ§μν΄μ£Όλλ°, ν΄λΉ λ©μλλ₯Ό μ΄μ©ν΄μ μ€λ λμ μνλ₯Ό μ μ΄ ν μ μλ€.
- μ¦, μ€λ λμ μ€ν μνλ₯Ό λ³κ²½νκ±°λ νλ¦μ μ‘°μ νλλ° ν΄λΉ λ©μλκ° μ΄μ©μ΄ λλ€.
- μλ₯Όλ€λ©΄, start() / run() / sleep() / join() / interrupt() / yield() ... λ±μ λ©μλλ€μ μ€λ λμμ μ 곡μ ν΄μ€.
- ν΄λΉ λ©μλλ€μ μ΄μ©ν΄μ μνλ₯Ό λ³κ²½ ν μ μλ€λ μλ―Έμ.
- λν, μ€λ λκ° μ€ν λμ€ μ μ λ©μΆκ³ λμ€μ μ€νλλλΌλ, CPU λ μ§μ€ν°μ μ€ν μνκ° μ νν μ μ₯λκ³ λ³΅μλκΈ° λλ¬Έμ μ€λ λκ° μ€λ¨λ λΆλΆλΆν° μμ νκ² μ΄μ΄μ μ€νμ΄ λ¨.
- μ¦, 곡μ μμμ λν λκΈ°ν λ¬Έμ λ§ μ‘°μ¬νλ©΄ λ¨.
(1) μ€λ λμ μν
- μμ±λ μ€λ λκ° CPUλ₯Ό μ»μ΄ μ€νλκ³ μ΅μ’ μ μΌλ‘ μ’ λ£λ λκΉμ§ μ¬λ¬ μν λ³νλ₯Ό κ²ͺκ² λ¨.
- JVMμ΄ μ€μ λ‘ μΈμνλ μ€λ λ μν μ¦, 곡μμ μΈ μλ° μνλ 6κ°μ§κ° μμ.
- CPU μ½μ΄ νκ°λΉ μ€ν μνμ λμ¬μ§ μ μλ μ€λ λμ μλ μ€μ§ νλμ΄λ€.
- νλμ μ€λ λκ° μ€ν μ€(Running) μνμμ, μλΆν μ μν΄ CPU μ¬μ© μκ°μ΄ λλλ©΄ μ€ν λκΈ° μν(Runnable)λ‘ λμκ°κ³ , λ€λ₯Έ μ€λ λκ° μ€ν μνλ‘ μ νμ΄ λκ² λλ€.
- μ¦, λ΄κ° κ΄λ¦¬νκΈ° μ κΉμ§λ κΈ°λ³Έμ μΌλ‘ μ΄μ체μ μμ μ€λ λλ€μ μ€ν μν <-> μ€ν λκΈ° μνλ‘ μλμΌλ‘ μ€μΌμ€λ§νλ©° κ΄λ¦¬λ₯Ό ν΄μ£Όκ² λλ€. μ½κ²λ§ν΄, μλΆν λ‘ λ²κ°μκ°λ©΄μ μνλ₯Ό λ³κ²½ν΄μ£Όλ©΄μ μ€νμ ν΄μ€λ€κ³ 보면 λλ€.
[1] java.lang.Thread.State Enumμ μ μλ μ€λ λ μν 6κ°μ§
- NEW: Thread κ°μ²΄λ μμ±λμμ§λ§ μμ§ start()κ° νΈμΆλμ§ μμ μνλ₯Ό μλ―Ένλ€.
- RUNNABLE: μ€ν κ°λ₯ν μν(Running λλ OSμ μν΄ μ€μΌμ€ λκΈ° μ€μΈ μν) - λκΈ° μνλ‘ λ³΄λ©΄ λ¨.
- BLOCKED: λ€λ₯Έ μ€λ λκ° κ°μ§ λͺ¨λν° λ½μ κΈ°λ€λ¦¬λ μ€μ μν
- WAITING: λ€λ₯Έ μ€λ λμ λͺ μμ μΈ μλ¦Όμ΄ μμ λκΉμ§ 무ν λκΈ° μν ( wait(), join() λ± )
- TIMED_WAITING: μΌμ μκ° λμ λκΈ° μν ( sleep(), join(timeout) λ± )
- TERMINATED: μ€λ λκ° μ’ λ£λ μν ( run() λ©μλμ μ’ λ₯λ₯Ό μλ―Έν¨ )
(2) μ€λ λμ μν μ μ΄ λ©μλ
[1] void setPriority(int newPriority) λ©μλ
- μ€λ λμ μ°μ μμλ₯Ό λ³κ²½μ ν μ μμΌλ©°, λμ μ°μ μμλ₯Ό κ°μ§λ μ€λ λκ° CPUλ₯Ό μ»μ νλ₯ μ΄ λμ.
[2] static void sleep(long millis) throws InterruptedException λ©μλ
- νμ¬ μ€ν μ€μΈ μ€λ λκ° μ ν΄μ§ μκ° λμ μ€νμ λ©μΆκ³ TIMED_WAITING μνλ‘ λ€μ΄κ°κ² λ¨.
- μκ°μ΄ λ€ μ§λκ² λλ©΄ RUNNABLE μν μ¦, μ€ν λκΈ° μνκ° λλ©°, μ€μΌμ€λ¬μ μν΄ μ΄νμ μ€ν μνκ° λ¨.
- λ€λ₯Έ μ€λ λκ° sleep() λ μ€λ λλ₯Ό interrupt() λ©μλλ₯Ό ν΅ν΄ κΉ¨μ°λ©΄ InterruptedException μμΈ λ°μν¨.
- μλ°μμλ λ³΄ν΅ μλͺ»λ νλ¦μ λ°λ₯Έ μκΈ°μΉ λͺ»ν λ¬Έμ κ° λ°μν λ μμΈλ₯Ό μ¬μ©νλ€.
- νμ§λ§, InterruptedExcetpionμ μ’ λ νΉνλ€. μ΄μ λ, μΌμ μ μ§ μ€μΈ μ€λ λλ₯Ό κΉ¨μ°λ νμλ μμΈμ μΈ μν©μΌλ‘ μλ°μμλ λ³΄κ³ μμΌλ©°, μ€λ λκ° sleep() μ΄λ, wait() μ€μ΄λΌλ 건 μ΄ μμ μ λ§μΉκΈΈ κΈ°λ€λ¦°λ€λ μλ°μ κ²°μ μΌλ‘ λ³΄κ³ μμΌλ©°, μΈλΆμμ κ°μ λ‘ interrupt()λ‘ κΉ¨μ΄λ€λ건 μμΈμ μΈ λΆλΆμΌλ‘ κ°μ£Όλ₯Ό νλ€.
- μ¦, interrupt() λ©μλμ μν΄ κΉ¨μ΄μ§ μ€λ λλ μμΈμΈ λΆλΆμΌλ‘ κ°μ£Όλ₯Ό νκΈ° λλ¬Έμ μμΈμ²λ¦¬λ₯Ό ν΄λμ΄μΌν¨.
[3] static void yield() λ©μλ
public class YieldExample {
public static void main(String[] args) {
Runnable task = () -> {
String name = Thread.currentThread().getName();
for (int i = 0; i < 5; i++) {
System.out.println(name + " - " + i);
Thread.yield(); // λ€λ₯Έ μ€λ λμκ² μ보
}
};
Thread t1 = new Thread(task, "Thread-1");
Thread t2 = new Thread(task, "Thread-2");
t1.start();
t2.start();
}
}
- νμ¬ μ€νμ€μΈ μ€λ λκ° μ μ μ€νμ λ©μΆκ³ Runnable μν μ¦, μ€ν λκΈ° μνλ‘ λ€μ΄κ°.
- νμ§λ§, μ΄μ체μ μ€μΌμ€λ¬κ° λ°λμ λ€λ₯Έ μ€λ λλ₯Ό μ€νν μ§ λ³΄μ₯νμ§ μλλ€.
- μ¦, yield() νΈμΆ νμλ λ€μ λ°λ‘ κ°μ μ€λ λκ° μ€νλ μ μλ€λ μλ―Έμ΄λ€.
- yield()λ μ£Όλ‘ λ€λ₯Έ μ€λ λμκ² μ€ν κΈ°νλ₯Ό μ£Όκ³ μΆμ λ, CPU μ μ κ²½μμ μννλ μ©λλ‘ μ°μΈλ€.
[4] void join() throws InterruptedException
Thread t = new Thread(() -> {
System.out.println("μ€λ λ μμ");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
System.out.println("μ€λ λ μ’
λ£");
});
t.start();
try {
System.out.println("main μ€λ λκ° t μ€λ λλ₯Ό κΈ°λ€λ¦½λλ€.");
t.join(); // tκ° λλ λκΉμ§ main μ€λ λ λκΈ°
System.out.println("tκ° μ’
λ£λμ΄ main μ€λ λκ° λ€μ μ€νλ©λλ€.");
} catch (InterruptedException e) {
e.printStackTrace();
}
- νμ¬ μ€ν μ€μΈ μ€λ λκ° λ€λ₯Έ νΉμ μ€λ λκ° μ’ λ£λ λκΉμ§ κΈ°λ€λ¦¬λλ‘ νλ λ©μλλ₯Ό μλ―Ένλ€.
- μ€λ λ λ κ³³μμ κ°μ μλ‘ join() λ©μλλ₯Ό νΈμΆνκ² λλ©΄ λ°λλ½(κ΅μ°©μν)μ΄ λ°μνκ² λλ€.
- μ¦, μμν μλ‘κ° κΈ°λ€λ¦¬λ μν©μ΄ λλ²λ¦Ό. μ΄λ¬ν κ΅μ°© μνλ₯Ό κ³ λ €ν΄μ μ½λλ₯Ό μ§μΌνλ€.
[5] void interrupt() λ©μλ
- μ€λ λλ₯Ό μΈν°λ½νΈμν΄
- μ€λ λκ° wait(), join(), sleep()μ μν΄ μ€λ¨λ μνμλ€λ©΄, κ·Έ μνμμ κΉ¨μ΄λ Runnable μνκ° λ¨.
- μ¦, μ€λ¨ λ μνμμ μ€ν λκΈ° μνλ‘ κ°μ λ‘ λ³κ²½μ νκ² λ§λλ λ©μλμ΄λ€.
(3) μ€λ λ μν μ μ΄λ₯Ό μν Object ν΄λμ€μ λ©μλ
[1] void wait() throws InterruptedException λ©μλ
- νμ¬ μ€ν μ€μΈ μ°λ λλ₯Ό μΌμ μ μ§ μνλ‘ λ§λλ λ©μλμ΄λ€.
- notify() λλ notifyAll() λ©μλκ° νΈμΆμ΄ λ λ κΉμ§ λκΈ°λ₯Ό νκ² λλ€.
- νΉμ§μΌλ‘λ, synchronized λΈλ‘ μμμλ§ νΈμΆμ΄ κ°λ₯νλ€.
[2] void wait(long millis) throws InterruptedException
- vait() λ©μλμ μκ° μ νμ μ€ λ©μλμ΄λ€.
- μ§μ ν λ°λ¦¬μ΄ λ§νΌλ§ κΈ°λ€λ¦¬κ³ , κ·Έ μκ° λμ notify() κ° νΈμΆλμ§ μμΌλ©΄ μλμΌλ‘ κΉ¨μ΄λμ λκΈ° μνλ‘ λ€μ΄κ°λ€.
- μ¦, νμμμ κΈ°λ₯μ΄ ν¬ν¨λ wait() λ©μλλ₯Ό μλ―Ένλ€.
- νΉμ§μΌλ‘λ, synchronized λΈλ‘ μμμλ§ νΈμΆμ΄ κ°λ₯νλ€.
[3] void notify()
- wait() μνλ‘ λκΈ° μ€μΈ μ°λ λλ€ μ€μμ ν κ°λ₯Ό κΉ¨μ΄λ€.
- μλ° λͺ μΈμμμλ μ΄λ€ μ°λ λκ° κΉ¨μ΄λ μ§ λͺ ννκ² μ§μ νμ§ μκ³ , JVM ꡬνμ λ°λΌ λ€λ₯΄λ€κ³ λͺ μκ° λμ΄μμ.
- μ¦, κΊ μ΄λλ μ°λ λλ JVM μ€μΌμ€λ¬κ° κ²°μ νλλ°, μ¬μ€μ λλ€ νΉμ μμλ‘ ν μ°λ λλ₯Ό κ³¨λΌ κΉ¨μ°λ μ μ΄λ€.
- νΉμ§μΌλ‘λ, synchronized λΈλ‘ μμμλ§ νΈμΆμ΄ κ°λ₯νλ€.