[Java] Threadμ stop()κ³Ό interrupt()μ λΉκ΅
μΆμ²
ChatGPT
μλ° 8 μμ€ μ½λ
https://cano721.tistory.com/165
[Java] μ°λ λ 5 - μ°λ λμ μ€νμ μ΄(sleep, interrupt, join, yield)
μ°λ λμ μ€μΌμ€λ§ κ΄λ ¨ λ©μλ λ©μλ μ€ λͺ static void sleep(long millis) static void sleep(long millis, int nanos) μ§μ λ μκ°(μ²λΆμ 1μ΄ λ¨μ)λμ μ°λ λλ₯Ό μΌμμ μ§μν¨λ€. μ§μ ν μκ°μ΄ μ§λκ³ λλ©΄,
cano721.tistory.com
μλ°μ Thread.stop() λ©μλλ μ€λ λλ₯Ό κ°μ λ‘ μ’ λ£μν€λ μν ν¨μλ‘ deprecated λλ€. stop()μ λ¬Έμ ν΄κ²°μ μν΄ interrupt() λ©μλλ₯Ό μ¬μ©ν΄ μ€λ λλ₯Ό μ’ λ£νλ κ²μ κΆμ₯νλ€.
Thread.stop() μμ€ μ½λ λΆμ
Thread.stop()μ μ€λ λμ κ°μ λ‘ ThreadDeath μμΈλ₯Ό λμ Έ μ’ λ£μν¨λ€.
@Deprecated
public final void stop() {
SecurityManager security = System.getSecurityManager();
if (security != null) {
checkAccess();
if (this != Thread.currentThread()) {
security.checkPermission(SecurityConstants.STOP_THREAD_PERMISSION);
}
}
// A zero status value corresponds to "NEW", it can't change to
// not-NEW because we hold the lock.
if (threadStatus != 0) {
resume(); // Wake up thread if it was suspended; no-op otherwise.
// μ€λ λκ° μ μ§ μνλ©΄ μ¬κ°
}
// The VM can handle all thread states
// λ€μ΄ν°λΈ λ©μλλ₯Ό ν΅ν΄ μ€λ λλ₯Ό μ’
λ£μν΄
stop0(new ThreadDeath());
}
- stop0() λ©μλλ λ€μ΄ν°λΈ λ©μλμ΄λ€. μ΄ λ©μλλ JVM λ 벨μμ κ°μ λ‘ μ€λ λλ₯Ό μ’ λ£νλ λͺ λ Ήμ μννλ€.
- ThreadDeath μμΈλ μ€λ λμ λμ Έμ§κ³ , μ΄ μμΈλ₯Ό catchνμ§ μμΌλ©΄ μ€λ λκ° μ’ λ£λλ€. μ΄ λ°©μμ λ§€μ° κ°μ μ μ΄κΈ° λλ¬Έμ μ€λ λκ° λ¦¬μμ€λ₯Ό μ μ ν ν΄μ ν κΈ°νλ₯Ό κ°μ§ λͺ»νλ€.
λ¬Έμ μ
- μ€λ λλ₯Ό κ°μ λ‘ μ€λ¨μμΌ(μ€λ λλ₯Ό λ°λ‘ TERMINATED μνλ‘ μ νμμΌ) μ κΈμ΄ ν΄μ λμ§ μκ±°λ μμμ΄ μ λλ‘ ν΄μ λμ§ μμ μ μλ€.
- μ€λ λλ₯Ό μ¦μ μ’ λ£μν€λ―λ‘, μ€λ λκ° μμμ μ¬μ©νκ±°λ 곡μ μμμ κ°±μ μ€μΌ λ μ΄λ₯Ό κ°μκΈ° λ©μΆλ©΄ λ°μ΄ν°μ μΌκ΄μ±μ΄ κΉ¨μ§ μ μλ€.
- μ€λ λκ° μκ³ μμμμ 곡μ μμμ μμ μ€μ΄μλ€λ©΄, κ°μμ€λ½κ² μ€λ λκ° μ’ λ£λλ©΄μ λͺ¨λν° λ½μ΄ ν΄μ λμ§ μκ±°λ μμ λμκ° λ°μν μ μλ€.
- ThreadDeath μμΈλ₯Ό λμ§κΈ° λλ¬Έμ μκΈ°μΉ μμ μνλ‘ μ’ λ£λ μ μλ€.
Thread.interrupt() μμ€ μ½λ λΆμ
Thread.interrupt()λ μ€λ λμ μΈν°λ½νΈ μ νΈλ₯Ό λ³΄λ΄ μ€λ¨ μμ²μ νλ€. μ΄ λ©μλλ μ€λ λκ° μλ΅ν μ μλλ‘ μΈν°λ½νΈ μνλ₯Ό μ€μ ν΄ λλ μν μ νλ€.
public void interrupt() {
if (this != Thread.currentThread())
checkAccess(); // μ κ·Ό κΆν κ²μ¬
synchronized (blockerLock) {
Interruptible b = blocker;
if (b != null) {
// λ€μ΄ν°λΈ λ©μλλ₯Ό ν΅ν΄ μΈν°λ½νΈ μ€ν
interrupt0(); // Just to set the interrupt flag
b.interrupt(this);
return;
}
}
interrupt0(); // λ€μ΄ν°λΈ λ©μλλ₯Ό ν΅ν΄ μΈν°λ°νΈ μν μ€μ
}
- interrupt()λ μΈν°λ½νΈ μνλ₯Ό μ€μ νκ±°λ, νμ¬ μ€λ λκ° μ 겨 μλ κ²½μ° μ΄λ₯Ό ν΄μ ν μ μλλ‘ νλ€.
- interrrupt0()μ λ€μ΄ν°λΈ λ©μλλ‘, JVMμμ μ€λ λμ μΈν°λ½νΈ μνλ₯Ό λ³κ²½νλλ‘ νλ€.
- μΈν°λ½νΈκ° νΈμΆλ μ€λ λλ μ€μ¬λ‘ μΈν°λ½νΈ μνλ₯Ό νμΈνκ³ νμν μμ μ μννλ©° μ’ λ£ μ¬λΆλ₯Ό κ²°μ νλ€.
μ€λ λ μνμ λ°λ₯Έ interrupt() λμ
- μ€λ λκ° sleep(), wait(), join()κ³Ό κ°μ λκΈ° μν(TIMED_WAITING, WAITING)μμ μΈν°λ½νΈ μ νΈλ₯Ό λ°μΌλ©΄, InterruptedException μμΈκ° λ°μνλ©°, μ€λ λλ λκΈ° μνμμ λ²μ΄λκ² λλ€. μ΄λ μμΈλ₯Ό μ²λ¦¬ν΄ μ€λ λλ₯Ό μ’ λ£νκ±°λ λ€λ₯Έ μμ μ μνν μ μλ€.
- μ€λ λκ° μ€ν κ°λ₯ μν(RUNNABLE)μ μμ λ interrupt()κ° νΈμΆλλ©΄, μ€λ λλ μΈν°λ½νΈ νλκ·Έκ° μ€μ λ λΏ μ€νμ΄ μ¦μ μ€λ¨λμ§λ μλλ€. ν΄λΉ μ€λ λ λ΄μμ Thread.interrupted() λ©μλλ₯Ό ν΅ν΄ μΈν°λ½νΈ νλκ·Έλ₯Ό νμΈνκ³ , νλκ·Έκ° μ€μ λ κ²½μ° μ€λ λλ₯Ό μ’ λ£νκ±°λ μ μ ν λμμ μνν μ μλ€.
interrupt()λ‘ μ€λ λλ₯Ό μ’ λ£νκΈ°
1. λ°λ³΅λ¬Έ μμμ isInterrupted()λ₯Ό ν΅ν΄ interrupt() νΈμΆ μ¬λΆλ₯Ό νμΈν΄ νμΆνλ€.
2. try-catchλ¬Έμ ν΅ν΄ InterruptedException λ°μμ μ‘μλ΄μ΄ try λ¬Έμμ μ€ννλ κ²μμ λΉ μ Έλμ¨λ€.
public class InterruptExample extends Thread {
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
// μ€λ λμ μμ
μν
System.out.println("Running...");
Thread.sleep(1000); // μ€λ λκ° μ μ λ©μΆ€
} catch (InterruptedException e) {
// μΈν°λ½νΈκ° λ°μνλ©΄ μμΈκ° λ°μνκ³ μ€λ λλ κΉ¨μ΄λ¨
System.out.println("Thread interrupted, stopping...");
break; // 루νλ₯Ό λΉ μ Έλκ°μΌλ‘μ¨ μ€λ λλ₯Ό μ’
λ£
}
}
// νμν μ 리 μμ
μν
System.out.println("Thread exiting...");
}
public static void main(String[] args) {
InterruptExample thread = new InterruptExample();
thread.start();
try {
Thread.sleep(3000); // λ©μΈ μ€λ λ λκΈ°
} catch (InterruptedException e) {
e.printStackTrace();
}
thread.interrupt(); // μ€λ λμ μΈν°λ½νΈ μμ²
}
}