스레드의 종료
run() 메서드의 종료는 스레드의 종료를 의미한다.
일반적으로 지속적인 작업을 하기 위해 run() 내에 while문을 포함하고 있으며, 이 while문이 끝나면 스레드가 종료되는 경우가 많다.
while문의 조건을 이용하여 스레드를 종료할 수 있다.
/**
while문의 조건을 이용한 스레드의 종료
**/
class TerminateThread extends Thread {
// 스레드의 종료를 제어하는 플래그
private boolean flag = false;
public void run() {
int count = 0;
System.out.println( this.getName() + "시작" );
while ( !flag ) {
try {
this.sleep( 100 );
} catch( InterruptedException e ) {
}
}
System.out.println( this.getName() + "종료" );
}
// flag가 true로 설정되면 while문이 끝난다.
public void setFlag( boolean flag ) {
this.flag = flag;
}
}
public class TerminateThreadMain {
public static void main( String args[] ) throws Exception {
System.out.println( "작업시작" );
TerminateThread a = new TerminateThread();
TerminateThread b = new TerminateThread();
TerminateThread c = new TerminateThread();
a.start();
b.start();
c.start();
int i;
System.out.print( "종료할 스레드를 입력하시오! A, B, C, M?\n" );
while ( true ) {
// 문자를 입력받음
i = System.in.read();
if ( i == 'A' ) {
a.setFlag( true );
} else if ( i == 'B' ) {
b.setFlag( true );
} else if ( i == 'C' ) {
c.setFlag( true );
} else if ( i == 'M' ) {
a.setFlag( true );
b.setFlag( true );
c.setFlag( true );
System.out.println( "main종료" );
break;
}
}
}
}
// output
작업시작
종료할 스레드를 입력하시오! A, B, C, M?
Thread-1시작
Thread-2시작
Thread-3시작
M
main종료
Thread-1종료
Thread-2종료
Thread-3종료
/**
두개의 조건을 이용한 스레드의 종료
**/
class ControlThread extends Thread {
// 모든 스레드의 종료를 제어하는 플래그
public static boolean all_exit = false;
// 스레드의 종료를 제어하는 플래그
private boolean flag = false;
public void run() {
int count = 0;
System.out.println( this.getName() + "시작" );
// flag 나 all_exit 둘 중 하나만 true이면 while문이 끝난다.
while ( !flag && !all_exit ) {
try {
this.sleep( 100 );
} catch( InterruptedException e ) {
}
}
System.out.println( this.getName() + "종료" );
}
public void setFlag( boolean flag ) {
this.flag = flag;
}
}
public class ControlThreadMain {
public static void main( String args[] ) throws Exception {
System.out.println( "작업시작" );
TerminateThread a = new TerminateThread();
TerminateThread b = new TerminateThread();
TerminateThread c = new TerminateThread();
a.start();
b.start();
c.start();
Thread.sleep( 100 );
int i;
System.out.print( "종료할 스레드를 입력하시오! A, B, C, M?\n" );
while ( true ) {
i = System.in.read();
if ( i == 'A' ) {
a.setFlag( true );
} else if ( i == 'B' ) {
b.setFlag( true );
} else if ( i == 'C' ) {
c.setFlag( true );
} else if ( i == 'M' ) {
// 모든 스레드를 종료한다.
ControlThread.all_exit = true;
System.out.println( "main종료" );
break;
}
}
}
}
// output
작업시작
종료할 스레드를 입력하시오! A, B, C, M?
Thread-1시작
Thread-2시작
Thread-3시작
A
Thread-1종료
B
Thread-2종료
C
Thread-3종료
M
main종료