μΌ | μ | ν | μ | λͺ© | κΈ | ν |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- μ½λ©ν μ€νΈμ€λΉ
- λΉμ£ΌκΈ°μ νΈ
- tcp μΈκ·Έλ¨ΌνΈ
- μ€λ₯κ²μΆ
- i-type
- reducible
- IEEE 802
- 그리λ μκ³ λ¦¬μ¦
- leetcode
- μ°λΆν¬db
- μ€λΈμ
- μ€λ₯μ μ΄
- xv6
- μλΉμ€ ν리미ν°λΈ
- well known ν¬νΈ
- κ°λ°μμ·¨μ
- νλ‘μ΄λμμ
- mariadb
- git merge
- νν΄99
- μ€λ λ
- μμλ²νΈ
- νλ μ ꡬ쑰
- μ£ΌκΈ°μ νΈ
- tcp νλ‘ν μ½
- ν°μ€ν 리μ±λ¦°μ§
- ν ν° λ²μ€
- λ°μ΄ν° μ μ‘
- til
- 99ν΄λ½
- Today
- Total
UnfazedβοΈπ―
[Java] μ€λ λ μ’ λ£ & Daemon μ€λ λ λ³Έλ¬Έ
μ€λ λ μ€λ¨μ νμμ±κ³Ό μν©
μ ν리μΌμ΄μ μμ μ€λ λλ μμμ μλΉνλ€. μ€λ λκ° μ€ν μ€μ΄μ§ μλλΌλ λ©λͺ¨λ¦¬μ 컀λ μμμ μ¬μ©νλ©°, μ€ν μ€μΈ κ²½μ° CPU μκ°μ ν λΉλ°λλ€. μ΄λ¬ν μμ μλΉλ λΆνμνκ² μ€νλκ³ μκ±°λ λ μ΄μ μμ μ μννμ§ μλ μ€λ λκ° μ‘΄μ¬ν λ λ¬Έμ κ° λλ€. νΉν λ€μκ³Ό κ°μ μν©μμ μ€λ λ μ€λ¨μ΄ μꡬλλ€.
- λΆνμν 리μμ€ νμ: μμ μ μλ£ν νμλ μ€λ λκ° μ’ λ£λμ§ μμ 리μμ€λ₯Ό κ³μ μλΉνλ κ²½μ°, ν΄λΉ μ€λ λλ₯Ό μ’ λ£ν¨μΌλ‘μ¨ μμ μ¬μ©μ μ΅μ νν μ μλ€.
- λΉμ μ λμ λμ: μλ²μ μμ²μ 보λ΄κ±°λ 볡μ‘ν κ³μ°μ μννλ λμ€, μμλ³΄λ€ μ€λ 걸리λ κ²½μ°λ μλ΅μ΄ μλ κ²½μ° μ€λ λλ₯Ό μ€λ¨ν΄ μμ€ν μ 체μ μμ μ±μ μ μ§ν μ μλ€.
- μ ν리μΌμ΄μ μ’ λ£ μ μ²λ¦¬: λ©μΈ μ€λ λκ° μ’ λ£λλλΌλ μΌλ°(λΉλ°λͺ¬) μ€λ λκ° μ€ν μ€μ΄λ©΄ JVMμ μ’ λ£λμ§ μλλ€. λ°λΌμ μ ν리μΌμ΄μ μ’ λ£ μ μ λͺ¨λ μΌλ° μ€λ λλ₯Ό μ μ νκ² μ 리ν νμκ° μλ€.
μΈν°λ½νΈ(interrupt) λ©μλλ₯Ό μ΄μ©ν μ€λ λ μ€λ¨
μλ°μμ μ€λ λλ₯Ό μ€λ¨νλ 첫 λ²μ§Έ λ°©λ²μ interrupt() λ©μλλ₯Ό μ¬μ©νλ κ²μ΄λ€. κ° μ€λ λ κ°μ²΄λ λ΄λΆμ "interrupted status" νλκ·Έλ₯Ό κ°μ§κ³ μμΌλ©°, interrupt() νΈμΆ μ ν΄λΉ νλκ·Έκ° trueλ‘ μ€μ λλ€.
μΈν°λ½νΈ λμ λ°©μ
- λΈλ‘νΉ λ©μλ λ΄ μΈν°λ½νΈ: μ€λ λκ° sleep(), wait(), join() λ±μ λ©μλλ₯Ό μ€ν μ€μΈ κ²½μ°, μ΄ λ©μλλ€μ μΈν°λ½νΈκ° λ°μνλ©΄ μ¦μ InterruptedExceptionμ λ°μμν¨λ€. μμ μ½λμμ Thread.sleep(500000) νΈμΆμ μΈν°λ½νΈ μ μμΈλ₯Ό λμ§κ³ , μμΈ μ²λ¦¬ λΈλ‘μμ λ©μμ§λ₯Ό μΆλ ₯ν ν μ€λ λλ₯Ό μ’ λ£νλ€.
- λͺ μμ μΈν°λ½νΈ 체ν¬: μ€λ λ λ΄λΆμμ μ£ΌκΈ°μ μΌλ‘ Thread.currentThread().isInterrupted() λ©μλλ₯Ό νΈμΆνμ¬ μΈν°λ½νΈ μνλ₯Ό νμΈνκ³ , μνμ λ°λΌ μμ μ μ€λ¨ν μ μλ€. λλ²μ§Έ μμ μ½λμ LongComputationTaskμμλ 루ν λ΄μμ ν΄λΉ κ²μ¬λ₯Ό μννμ¬, μΈν°λ½νΈκ° κ°μ§(μ£Όμ μ²λ¦¬ λ λΆλΆ)λλ©΄ μ€κ° κ³μ° κ²°κ³Όλ₯Ό λ°ννκ³ μ’ λ£νλ€.
λΈλ‘νΉ λ©μλ(Blocking Method) : νΉμ μμ μ μννλ λμ νμ¬ μ€λ λμ μ€νμ λ©μΆκ³ , μ΄λ€ μ‘°κ±΄μ΄ μΆ©μ‘±λκ±°λ νμμμμ΄ λ°μν λκΉμ§ κΈ°λ€λ¦¬κ² λ§λλ λ©μλ
- μ€ν νλ¦ μ°¨λ¨: λ©μλ μλ£/μ€λ¨ 쑰건 μΆ©μ‘± μ κΉμ§ μ€λ λ μ€ν μ μ§
- μμ μ μ μ ν:
- CPU 리μμ€: λκΈ° μ λ―Έμ μ (ex: Thread.sleep())
- μ μΆλ ₯ 리μμ€: 물리μ μ₯μΉ μ μ (ex: νμΌ μ½κΈ°/μ°κΈ°)
- λΈλ‘νΉ ν¬μΈνΈ: μΈν°λ½νΈ κ°λ₯ μ§μ νμ → μ€λ λ μ μ΄μ ν΅μ¬ μμΉ
κ΅¬λΆ | λ©μλ | λΈλ‘νΉ νΈλ¦¬κ±° |
μ€λ λ μ μ΄ | Thread.sleep() | μκ° κΈ°λ° λκΈ° |
λκΈ°ν | Object.wait() | λͺ¨λν° λ½ ν΄μ λκΈ° |
μ μΆλ ₯ μμ | InputStream.read() | λ°μ΄ν° μμ λκΈ° |
μ€λ λ μ‘°μΈ | Thread.join() | ν μ€λ λ μ’ λ£ λκΈ° |
ν μ°μ° | BlockingQueue.take() | ν μμ μ‘΄μ¬ λκΈ° |
μΈν°λ½νΈ λ°©μ μμ
public class Main {
public static void main(String[] args) {
Thread thread = new Thread(new BlockingTask());
thread.start();
// μΈν°λ½νΈ νΈμΆ μ, μ€λ λ λ΄λΆμ sleep λ©μλκ° InterruptedExceptionμ λ°μμν΄
// thread.interrupt();
}
private static class BlockingTask implements Runnable {
@Override
public void run() {
try {
Thread.sleep(500000);
} catch (InterruptedException e) {
System.out.println("blocking thread νμΆ");
}
}
}
}
- μΌμ΄μ€ 1 (μΈν°λ½νΈ λ―ΈνΈμΆ): thread.interrupt() νΈμΆμ΄ μ£Όμ μ²λ¦¬λ μνμμλ, BlockingTask μ€λ λκ° 500μ΄ λμ μ¬λ¦½ μνμ 머무λ₯΄λ©° λ©μΈ μ€λ λλ μ’ λ£λμ§λ§ JVMμ ν΄λΉ μ€λ λκ° μ’ λ£λμ§ μμ κ³μ λκΈ°νλ€.
- μΌμ΄μ€ 2 (μΈν°λ½νΈ νΈμΆ): thread.interrupt()λ₯Ό νΈμΆνλ©΄, μ¬λ¦½ μ€μΈ μ€λ λκ° InterruptedExceptionμ λ°μμν€κ³ , μμΈ μ²λ¦¬ λΈλ‘ λ΄ λ©μμ§λ₯Ό μΆλ ₯ν ν μ€λ λκ° μ’ λ£λλ€.
μΈν°λ½νΈ λ°©μμ μ€λ λκ° λΈλ‘νΉ λ©μλλ₯Ό νΈμΆ μ€μΌ λ μ¦κ°μ μΌλ‘ μ’ λ£ν μ μλ μ₯μ μ μ 곡νλ€. λν, λͺ μμ μΌλ‘ μνλ₯Ό 체ν¬νλ λ°©λ²μ μ¬μ©νλ©΄ μ€λ λκ° μ΄λ€ μμ μ μννλ λμ€μλ μ€λ¨ μ¬λΆλ₯Ό νμΈν μ μλ€.
λ°λͺ¬ μ€λ λ(daemon thread)λ₯Ό μ΄μ©ν μ€λ λ μ€λ¨
λ°λͺ¬ μ€λ λλ JVMμ μ’ λ£ μ‘°κ±΄κ³Ό κ΄λ ¨νμ¬ μ€μν μν μ νλ€. κΈ°λ³Έμ μΌλ‘ μμ±λ μ€λ λλ μΌλ° μ€λ λλ‘ κ°μ£Όλλ©°, λͺ¨λ μΌλ° μ€λ λκ° μ’ λ£λμ΄μΌ JVMμ΄ μ’ λ£λλ€. λ°λͺ¬ μ€λ λλ λ©μΈ μ€λ λμ λ¬λ¦¬ μ ν리μΌμ΄μ μ μ’ λ£λ₯Ό λ°©ν΄νμ§ μλλ‘ μ€κ³λμ΄ μλ€.
λ°λͺ¬ μ€λ λ μ¬μ© μ κ³ λ € μ¬ν
- μ ν리μΌμ΄μ μ’ λ£: μ ν리μΌμ΄μ μ’ λ£ μ, λ°λͺ¬ μ€λ λλ μλμΌλ‘ μ’ λ£λλ€. λ°λΌμ λ°±κ·ΈλΌμ΄λ μμ μ΄λ μ₯μκ° μ€νλλ κ³μ° μμ μμ λ°λͺ¬ μ€λ λλ₯Ό μ¬μ©νλ©΄, λ©μΈ μ€λ λ μ’ λ£μ ν¨κ» λΆνμν 리μμ€ μλͺ¨λ₯Ό λ°©μ§ν μ μλ€.
- μ€μ μμ© μ¬λ‘: μΉ μλ²μ νμμμ μ²λ¦¬, μλλ‘μ΄λμ λ°±κ·ΈλΌμ΄λ μμ μ·¨μ, λΆμ° μμ€ν μμμ λΈλ‘νΉ νΈμΆ κ΄λ¦¬ λ± λ€μν λΆμΌμμ λ°λͺ¬ μ€λ λλ₯Ό νμ©νλ€.
λ°λͺ¬ μ€λ λ λ°©μ μμ
public class Main {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(new LongComputationTask(new BigInteger("999999"), new BigInteger("999999999")));
// μ€λ λλ₯Ό λ°λͺ¬ μ€λ λλ‘ μ€μ νμ¬, λ©μΈ μ€λ λ μ’
λ£ μ ν¨κ» μ’
λ£λλλ‘ ν¨
thread.setDaemon(true);
thread.start();
// νμμ λ°λΌ μΌμ μκ° ν λ©μΈ μ€λ λκ° μ’
λ£λλλ‘ μ€μ ν μ μμ
// Thread.sleep(10000);
// λλ thread.interrupt() νΈμΆνμ¬ μ€λ¨ν μλ μμ
}
private static class LongComputationTask implements Runnable {
private BigInteger base;
private BigInteger power;
public LongComputationTask(BigInteger base, BigInteger power) {
this.base = base;
this.power = power;
}
@Override
public void run() {
System.out.println(base + "^" + power + " = " + pow(base, power));
}
private BigInteger pow(BigInteger base, BigInteger power) {
BigInteger result = BigInteger.ONE;
// 루ν λ΄μμ μΈν°λ½νΈ μνλ₯Ό νμΈνμ¬, μ€κ°μ μ’
λ£ν μ μλλ‘ μ²λ¦¬(μκ°μ΄ μ€λ걸리λ λΆλΆ)
for (BigInteger i = BigInteger.ZERO; i.compareTo(power) != 0; i = i.add(BigInteger.ONE)) {
if (Thread.currentThread().isInterrupted()) {
System.out.println("Prematurely interrupted LongComputationTask");
return result;
}
result = result.multiply(base);
}
return result;
}
}
}
ν΄λΉ μμμμλ LongComputationTaskκ° λ§€μ° ν° μ§μ κ³μ°μ μννλ€. 루ν λ΄λΆμμ μΈν°λ½νΈ μ¬λΆλ₯Ό νμΈνμ¬, λ§μ½ μΈν°λ½νΈκ° λ°μνλ©΄ μ€κ° κ²°κ³Όλ₯Ό λ°ννκ³ μ’ λ£νλ€. λ°λͺ¬ μ€λ λλ‘ μ€μ ν¨μΌλ‘μ¨ λ©μΈ μ€λ λκ° μ’ λ£λλ©΄ ν΄λΉ μ€λ λ μμ JVMμ μν΄ κ°μ μ’ λ£λλ―λ‘, μ ν리μΌμ΄μ μ’ λ£λ₯Ό μν μΆκ°μ μΈ μ€λ λ κ΄λ¦¬κ° νμνμ§ μλ€.
μ 리
μ€λ λ μ€λ¨μ μ ν리μΌμ΄μ μ μμ μ±κ³Ό ν¨μ¨μ μΈ μμ κ΄λ¦¬μ ν΅μ¬μ μΈ μν μ νλ€.
μΈν°λ½νΈ λ©μλλ₯Ό ν΅ν μ€λ λ μ€λ¨μ λΈλ‘νΉ λ©μλλ 루ν λ΄λΆμμ μΈν°λ½νΈ μνλ₯Ό 체ν¬νλ λ°©μμΌλ‘ μ€λ λμ μ μ μ’ λ£λ₯Ό 보μ₯νλ€.
λ°λ©΄, λ°λͺ¬ μ€λ λλ₯Ό νμ©νλ©΄ μ ν리μΌμ΄μ μ’ λ£ μ λ°±κ·ΈλΌμ΄λ μ€λ λλ‘ μΈν μ§μ° μμ΄ μμ νμκ° κ°λ₯νλ€.
μ°Έκ³ μλ£:
Udemy - Java λ©ν°μ€λ λ©, λ³νμ± λ° λ³λ ¬ μ€ν νλ‘κ·Έλλ° μ λ¬Έκ° λκΈ°