Java 다중 스레드 프로그래밍에서 java.lang.Thread 유형에는 일련의 메소드 start(), stop(), stop(Throwable) 및 suspens(), destroy() 및 이력서()가 포함되어 있습니다. 이러한 메소드를 통해 스레드에 대한 편리한 작업을 수행할 수 있지만 이러한 메소드 중 start() 메소드만 유지됩니다.
이러한 방법을 포기하는 이유는 Sun의 "Why are Thread.stop, Thread.suspens and Thread.resume Deprecated?" 기사에 자세히 설명되어 있습니다.
스레드를 정말로 종료해야 하는 경우 다음 방법을 사용할 수 있습니다.
1. 스레드의 run() 메서드 실행이 완료되고 스레드가 자연스럽게 종료되도록 합니다. (이 방법이 가장 좋습니다)
2. while(flag){} 등의 플래그 비트를 폴링하고 공유하여 스레드를 종료합니다. 플래그의 초기 값은 true로 설정되고, 종료해야 하는 경우에는 flag의 값을 false로 설정합니다. (이 방법도 별로 좋지 않습니다. 왜냐하면 while(flag){} 메서드가 차단되면 플래그가 유효하지 않게 되기 때문입니다.)
개인 휘발성 부울 정지 = false;
공공 무효 종료() {
중지 = 사실;
}
공개 무효 실행() {
동안(중지) {
// ... 일부 명령문
}
}
}
sleep()이나 wait() 수행으로 스레드가 Not Runnable 상태에 들어간 경우 wait()인 경우 플래그 비트를 사용하면 동작하지 않는다.
공개 최종 무효 대기(긴 시간 초과)
Throws InterruptedException 이 메소드는 현재 스레드(T라고 함)가 객체의 대기 세트에 자신을 배치한 다음 이 객체에 대한 모든 동기화 요구 사항을 포기하도록 합니다. 즉, 현재 스레드가 대기 상태가 됩니다.
wait()의 표준 사용법
동기화됨(obj){
while(<조건이 충족되지 않음>){
obj.wait();
}
조건을 만족하는 가공과정
}
이를 중지하고 싶다면 세 번째 방법을 사용할 수 있습니다.
3. Interrupt()를 사용하면 프로그램에서 InterruptedException 예외가 발생하여 실행 스레드가 run() 메서드를 종료하게 됩니다.
예를 들어:
공개 클래스 SomeThread {
공개 정적 무효 메인(문자열[] 인수)
{
스레드 스레드=새 스레드(새 Runnable(){
공개 무효 실행() {
동안 (!Thread.interrupted()) {
//처리할 작업을 처리한다
노력하다 {
System.out.println("잠자기 상태로 전환");
Thread.sleep(1000);
} 잡기(InterruptedException e) {
e.printStackTrace();
System.out.println("방해당했습니다!");
}
});
thread.start();
스레드.인터럽트();
}
}
자러 가다
나 방해받았어!