quilt code
[고급자바] Thread (4) 본문
1. Thread Yield
1) yield() 메소드
1. 현재 실행 대기중인 동등한 우선순위 이상의 다른 스레드에게 실행기회를 제공한다. (양보) |
2. 현재 실행 중인 스레드의 상태를 RUNNABLE 상태로 바꾼다. (WAITING이나 BLOCKED가 아니라) |
3. yield() 메소드를 실행한다고 해서 현재 실행 중인 스레드가 곧바로 RUNNABLE 상태로 전이된다고 확신할 수는 없다. |
2) 예제
|
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
|
public static void main(String[] args) {
new YieldThread1().start();
new YieldThread2().start();
}
}
class YieldThread1 extends Thread {
public YieldThread1() {
super("양보 스레드");
}
@Override
public void run() {
for(int i=0; i<10; i++) {
System.out.println(Thread.currentThread().getName() + " : " + i);
for(int j=0; j<1000000000; j++) {
}
Thread.yield(); //양보하기
}
}
}
class YieldThread2 extends Thread {
public YieldThread2() {
super("비양보 스레드");
}
@Override
public void run() {
for(int i=0; i<10; i++) {
System.out.println(Thread.currentThread().getName() + " : " + i);
for(int j=0; j<1000000000; j++) {
}
}
}
|
cs |
2. Thread Stop
| Thread의 stop() 메소드를 호출하면 스레드가 바로 멈춘다. 이 때 사용하던 자원을 정리하지 못하고 프로그램이 종료되어서 나중에 실행되는 프로그램에 영향을 줄 수 있다. 그래서 현재는 비추천 |
1) stop
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
Thread th1 = new ThreadStop1();
th1.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
/*
* Thread의 stop() 메소드를 호출하면 스레드가 바로 멈춘다.
* 이 때 사용하던 자원을 정리하지 못하고 프로그램이 종료되어서 나중에 실행되는 프로그램에 영향을 줄 수 있다.
* 그래서 현재는 비추천으로 되어 있다.
*/
th1.stop(); // 비추천 메소드
((ThreadStop1)th1).setStoped(true);
|
cs |
|
1
2
3
4
5
6
7
|
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
th2.interrupt(); // 인터럽트 걸기
|
cs |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
class ThreadStop1 extends Thread {
private boolean isStoped;
public void setStoped(boolean isStoped) {
this.isStoped = isStoped;
}
@Override
public void run() {
while(!isStoped) {
System.out.println("스레드 처리 작업 중...");
}
System.out.println("자원정리 중...");
System.out.println("실행 종료.");
}
}
|
cs |
2) interrupt() 메소드를 이용한 스레드 중지 방법
① 방법 1 : sleep() 메소드나 join() 메소드 등을 사용했을 때 interrupt() 메소드를 호출하면 InterruptedException이 발생한다. 이 예외를 이용하는 방법
|
1
2
3
4
5
6
7
8
9
10
11
12
|
@Override
public void run() {
try {
while(true) {
System.out.println("스레드 처리 작업 중...");
Thread.sleep(1);
}
} catch(InterruptedException ex) {
}
|
cs |
② 방법 2 : interrupt() 호출되었는지 검사하여 처리하기
ㄱ. 검사방법 1 : 스레드의 인스턴스 메소드를 이요하는 방법
|
1
2
3
4
|
if(this.isInterrupted()) {
System.out.println("인스턴스용 isInterrupted() 호출됨.");
break;
}
|
cs |
ㄴ. 검사방법 2 : 스레드 클래스의 정적 메소드를 이용하는 방법
|
1
2
3
4
5
6
7
8
9
10
|
if(Thread.interrupted()) {
System.out.println("정적 메소드 interrupted() 호출됨.");
System.out.println("if절 안에서... : " + Thread.interrupted());
break;
}
}
System.out.println("자원정리 중...");
System.out.println("실행 종료.");
|
cs |
'daily > 고급자바' 카테고리의 다른 글
| [고급자바] Thread(6) (0) | 2023.02.13 |
|---|---|
| [고급자바] Thread(5) (0) | 2023.02.10 |
| [고급자바] 컴퓨터와 가위바위보 프로그램 (0) | 2023.02.07 |
| [고급자바] Thread(3) (0) | 2023.02.07 |
| [고급자바] Thread (2) (0) | 2023.02.07 |