Interrupt() 메소드 (다시 runnable 상태가 된다.)
다른 thread에 예외를 발생시키는 interrupt 를 보낸다.
Thread가 join() , sleep() , wait() 메소드에 의해 블록킹 되었다면
Interrupt에 의해 다시 runnable 상태가 될수 있다.
Thread 종료하기
데몬등 무한 반복하는 thread가 종료될수 있도록 run() 메소드 내의 while문을 활용
Thread.stop()은 사용하지 않는다.
쓰레드가 run해서 찍는걸 했지만 서비스를 돌면 무한반복으로 돈다
계속 돌게 되는데 while문안에 flag를 써서 true냐 false냐로
package thread;
public class InterruptTest extends Thread {
public void run() {
int i;
for(i = 0; i < 101; i++) {
System.out.println(i);
}
try {
sleep(500); // 5초 기다렸다가 끝이 난다. ( 빨간불이 5초 기다렸다가 꺼진다. )
} catch (InterruptedException e) {
System.out.println(e);
System.out.println("wake !!!");
}
}
public static void main(String[] args) {
InterruptTest test = new InterruptTest();
test.start();
test.interrupt(); // 다시 인터럽트를 주면 이셉션으로 빠져서 wake!!!출력
System.out.println("end");
}
}
Thread 종료하기
데몬등 무한 반복하는 thread가 종료될수 있도록 run() 메소드 내의 while문을 활용
Thread.stop()은 사용하지 않는다.
쓰레드가 run해서 찍는걸 했지만 서비스를 돌면 무한반복으로 돈다
멈추게 하려면
boolean flag 에 true 또는 false 를 줘서 run() 메소드의 while문에 그 반대 이면 실행한다.
main 메소드에서 입력값에 따른 System.in.read() 를 받아서
조건절에 그 값을 받게 되면
threadA.setflag(true); 를 발생시켜서 멈추게 한다.
즉
public void setflag(boolean flag) {
this.flag = flag;
를 줘서 setflag를 호출하면서 true를 주면 멈추게 함
package test;
import java.io.IOException;
public class TerminateThread extends Thread {
private boolean flag = false;
// 쓰레드를 true일때 돌린다.
int i;
// 스레드에 이름을 줄수 있다.
TerminateThread(String name) {
super(name); // thread생성자에 이름을 받을수있는 생성자가 있다.
}
public void run() {
while(!flag) { // flag가 true일시 돌린다.
try {
sleep(1000);
} catch (InterruptedException e) {
System.out.println(e);
}
}
System.out.println(getName() + "end");
}
// 스레드를 생성하고 멈추게 하기 flag가 false 가 되면 멈춘다.
public void setflag(boolean flag) {
this.flag = flag; // 쭉 돌던 데몬이 멈추게 한다.
}
public static void main(String[] args) throws IOException {
TerminateThread threadA = new TerminateThread("A");
TerminateThread threadB = new TerminateThread("B");
threadA.start();
threadB.start();
// 멈추는건 입력을 받아서 멈춰보자
int in;
while(true) {
in = System.in.read();
if(in == 'A') {
threadA.setflag(true); // 멈추게 한다.
}
else if(in == 'B') {
threadB.setflag(true);
}else if(in == 'M') { // 다 멈추게 하기
threadA.setflag(true);
threadB.setflag(true);
break;
}
/*else {
System.out.println("try again");
}
*/
}
System.out.println("main end");
}
}
'JAVA Programming' 카테고리의 다른 글
[88] MultiThread 의 deadlock 과 wait() , notify() 와 notifyAll()- while사용 차이 (0) | 2020.08.04 |
---|---|
[87] Multi Thread 임계영역 , 동기화 2가지 방법(메소드,블록) (0) | 2020.08.04 |
[85] Thread 멀티 기타메소드CurrentThread() , wait() , join() , (0) | 2020.08.03 |
[84] Thread 란 무엇인가 ? (0) | 2020.08.03 |
[83] 바이트 단위 입출력 시스템 (0) | 2020.07.21 |