JAVA Programming

[86] Thread 종료하기 . boolean 으로 while문 true 시 인터럽트발생

꾸준히개발하자 2020. 8. 3. 20:31

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");
	}
}