반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 리눅스세팅
- include지시자
- MemoryStream
- first-child
- first-of-child
- StringWriter
- String char[] 형변환
- 상관서브쿼리
- sleep()메소드
- 스레드그룸
- 리눅스셋팅
- 상관 서브 쿼리
- StringReader
- 동기화
- interrupt()
- include 지시자
- Linux세팅
- 표현 언어
- char[] String 형변환
- include액션태그
- ID중복
- InputDialog
- interrupted()
- isinterrupted()
- Linux셋팅
- 메모리스트림
- ObjectInputStream
- ThreadGroup()
- Daemon()
- 아이디중복
Archives
- Today
- Total
다연이네
[days27] 스레드 강제종료 본문
반응형
스레드 강제 종료 방법
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