다연이네

[days27] 스레드 강제종료 본문

Java

[days27] 스레드 강제종료

 다연  2020. 10. 27. 18:39
반응형

스레드 강제 종료 방법

1. 플래그 변수 사용 (Stopped 필드만 사용)

package review;

import java.io.IOException;

public class Re02 {

	public static void main(String[] args) throws IOException {
		TerminatThread th1 = new TerminatThread('a');
		TerminatThread th2 = new TerminatThread('b');
		TerminatThread th3 = new TerminatThread('c');

		th1.setName("a");
		th2.setName("b");
		th3.setName("c");
		th1.start();
		th2.start();
		th3.start();
		
		System.out.println("종료시킬 스레드 입력");
		int i = System.in.read();
		while(true) {
			if(i=='a') th1.setStopped(true);
			if(i=='b') th2.setStopped(true);
			if(i=='c') th3.setStopped(true);
			if(i=='m') { 
				th1.setStopped(true);th2.setStopped(true);th3.setStopped(true);
				System.out.println("모든 스레드 종료");
				break;
			}
			
			}
			
		}



	}


class TerminatThread extends Thread{
	public char style; 
	private boolean stopped = false;

	public boolean isStopped() {
		return stopped;
	}
	public void setStopped(boolean stopped) {
		this.stopped = stopped;
	}


	public TerminatThread(char style) {
		this.style = style;
	}
	@Override
	public void run() {
		int cnt = 0;
		System.out.println(this.getName()+"시작");
		while(!stopped) {
			System.out.println(style);
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		System.out.println(this.getName()+"종료");
	}








}

2. static 클래스 변수 생성

 - while문 수정 ( main과 TerminatThread 클래스의 while문을 각각 수정)

while(true) {
			if(i=='a') th1.setStopped(true);
			if(i=='b') th2.setStopped(true);
			if(i=='c') th3.setStopped(true);
			if(i=='m') { 
				TerminatThread.allStopped= true;
				System.out.println("모든 스레드 종료");
				break;
			}
public static boolean allStopped = false;

while(!stopped && !allStopped) {
			System.out.println(style);
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

앞에 static이 있다 => static 클래스 변수
1. 클래스 당 하나만 만들어지는 필드
2. Save클래스의 rate 이자율은 모두 똑같았다.
a, b, c 스레드 객체 전부 공유하는 변수로, 한번 값을 주면 모든 변수에 적용

 

 

3. interrupt() 사용

 

package review;

public class Re02 {

	public static void main(String[] args) {

		InterruptThread t = new InterruptThread('@');
		t.setName("T");
		t.start();
		
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		t.interrupt();
		
		System.out.println("main스레드 종료");
		
	}

}


class InterruptThread extends Thread{
	public char style;
	//플래그 변수 없이

	public InterruptThread(char style) {
		this.style = style;
	}


	@Override
	public void run() {
		int cnt = 0;
		System.out.println(this.getName()+"-시작");
		try {
			while(true) {
				System.out.println(style);
				this.sleep(100);
			} 
		}catch (InterruptedException e) {
			//e.printStackTrace();
		}
		System.out.println(this.getName()+"-종료");
	}
}




3-2 @override 수정하기

	@Override
	public void run() {
		int count = 0;
		System.out.println(this.getName()+"-시작"); 
		
			while (true) {
				System.out.println(style);
					if(Thread.interrupted()) break; //break로 와일문 빠져나가기
			}
		
		System.out.println(this.getName()+"-종료"); 
	}
반응형

'Java' 카테고리의 다른 글

[days27] 스레드 그룹과 데몬스레드  (0) 2020.10.27
[days27] 동기화  (0) 2020.10.27
[days26] 스레드 - 동기화의 필요성  (1) 2020.10.26
[days26] 스레드 예제  (0) 2020.10.26
[days26] 스레드(Thread)  (0) 2020.10.26
Comments