자바 Thread_2
왜, 언제 스레드를 멈춰야 하는가??
- 스레드는 아무것도 하지 않을때에도 리소스를 사용함.
- 메모리와 커널 리소스
- CPU 시간뿐아니라 캐시까지 사용
- 생성한 스레드가 이미 작업을 완료했으면, 사용하지 않는 스레드의 리소스를 정리해야함.
- 스레드가 오작동을 해야하면 중지해야함 ! (응답없는데 서버에 요청)
- 애플리케이션 전체를 중단하기 위해서임 ! (최소 하나의 스레드만 실행되고 있어도 프로세스는 종료되지않음)
Thread.interrupt()
-> 각 스레드는 인터럭트 메서드를 가지고 있음
- 우리가 인터럽트하려는 스레드가 인터럽트 당했을 때 익셉션을 발생시키는 경우 !
- 이터럽트하려는 스레드가 신호를 명시적으로 처리하기 위해 !
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
32
33
34
35
36
37
38
39
40
41
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(new LongComuptionTask(new BigInteger("2"), new BigInteger("10")));
thread.start();
thread.interrupt();
}
private static class LongComuptionTask implements Runnable {
private BigInteger base;
private BigInteger power;
public LongComuptionTask(BigInteger base, BigInteger power) {
this.base = base;
this.power = power;
}
@Override
public void run() {
System.out.println(pow(base, power));
}
}
private BigInteger pow(BigInteger base, BigInteger power) {
BigInteger result = BigInteger.ONE;
for(BigInteger i = BigInteger.ONE; i.compareTo(power) != 0; i.add(BigInteger.ONE)) {
if(Thread.currentThread().isInterrupted()) {
System.out.println("interrupted");
return BigInteger.ZERO;
}
result = result.multiply(base);
}
return result;
}
}
Thread Daemon
- 메인 스레드가 종료되어도 애플리케이션 종료를 막지 않음.
- 주로 백그라운드 작업 (텍스트앱에서 시간마다 자동저장하는 기능)
- 작업 스레드에서 실행되는 코드를 제어할 수 없는 경우, Daemon쓰레드가 앱 종료를 방해하는 일은 없어야함.
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
32
33
34
35
36
37
38
39
40
41
42
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(new LongComuptionTask(new BigInteger("2"), new BigInteger("10")));
thread.setDaemon(true);
thread.start();
Thread.sleep(100);
thread.interrupt();
}
private static class LongComuptionTask implements Runnable {
private BigInteger base;
private BigInteger power;
public LongComuptionTask(BigInteger base, BigInteger power) {
this.base = base;
this.power = power;
}
@Override
public void run() {
System.out.println(pow(base, power));
}
private BigInteger pow(BigInteger base, BigInteger power) {
BigInteger result = BigInteger.ONE;
for(BigInteger i = BigInteger.ONE; i.compareTo(power) != 0; i.add(BigInteger.ONE)) {
if(Thread.currentThread().isInterrupted()) {
System.out.println("interrupted");
return BigInteger.ZERO;
}
result = result.multiply(base);
}
return result;
}
}
Thread join
- 스레드는 각각 독립적이고 실행순서를 우리가 통제할 수 없다.
출처 - https://kmooc.udemy.com/course/java-multi-threading/ (Java 멀티스레딩, 병행성 및 성능 최적화 - 전문가 되기 )
This post is licensed under CC BY 4.0 by the author.