1207-Thread: 스레드를 중지하는 방법
스레드 대상은 일회용 소모품에 속합니다. 일반적인 스레드가run 방법을 실행한 후에 스레드가 정상적으로 끝났습니다. 스레드가 끝난 후에 폐기되었습니다. 다시 start할 수 없고 하나의 스레드 대상만 새로 만들 수 있습니다.하지만 때로는 런 방법은 영원히 끝나지 않는다.예를 들어 프로그램에서 코드를 사용하여 Socket 감청 요청을 진행하거나 순환 처리가 필요한 다른 작업을 수행합니다.이런 상황에서, 일반적으로while 순환과 같은 순환에 이 임무들을 놓는다.라인을 끝내야 할 때 어떻게 라인을 종료합니까?
다음 세 가지 방법으로 스레드를 종료할 수 있습니다.
종료 플래그를 사용하여 스레드 종료
하나의 변수를 사용하여 순환을 제어합니다. 예를 들어 가장 직접적인 방법은boolean 형식의 로고를 설정하고, 이 로고를true 또는false로 설정해서while 순환이 종료되는지 여부를 제어하는 것입니다.
public class ThreadSafe extends Thread {
public volatile boolean exit = false;
public void run() {
while (!exit){
//do something
}
}
}
interrupt () 방법으로 라인 종료
interrupt () 방법을 사용하여 단말기 라인을 두 가지 상황으로 나눌 수 있다
스레드가 막힌 상태에 있다
예를 들어sleep, 동기화 자물쇠의wait, socket의receiver,accept 등 방법을 사용했을 때, 라인을 막힌 상태로 만들 수 있습니다.스레드의interrupt () 방법을 호출할 때, 시스템은InterruptedException 이상을 던져 코드에서 이상을 포획한 다음break에서 순환 상태로 뛰어나와 스레드를 정상적으로 끝냅니다.
보통 많은 사람들이 인터럽트 방법을 사용하면 라인이 끝난다고 생각하는데 사실은 틀렸다. 인터럽트 Exception 이상을 먼저 포획한 후에break를 통해 순환을 뛰어넘어야만 런방법을 정상적으로 끝낼 수 있다.
public class ThreadSafe extends Thread {
public void run() {
while (true) {
try {
Thread.sleep(5*1000); // 5
} catch(InterruptedException e) {
e.printStackTrace();
break; // , break 。
}
}
}
}
스레드가 차단 상태에 들어가지 않았습니다
isInterrupted () 판단 라인의 중단 로고를 사용하여 순환을 종료합니다.interrupt () 방법을 사용할 때 중단 로고는true로 설정됩니다. 사용자 정의 로고를 사용하여 순환을 제어하는 것과 같습니다.
public class ThreadSafe extends Thread {
public void run() {
while (!isInterrupted()){
//do something
}
}
}
왜 막힌 상태와 비막힌 상태를 구분해야 하는가? 막힌 상태가 있을 때interrupt()가 발생하면 시스템은 인터럽트 Exception 이상을 던지는 것 외에 인터럽트 () 함수를 호출한다. 호출 전 인터럽트 상태는true이고 호출 후 인터럽트 상태는false로 복원되기 때문에 이상을 던진 후 isInterrupted()를 통해 인터럽트 상태가true인 상태를 얻을 수 없다.따라서 순환을 종료할 수 없습니다. 따라서 라인이 막힌 코드 세그먼트에 들어가지 않았을 때 isInterrupted () 를 통해 중단이 발생했는지 여부를 판단하여 순환을 제어할 수 있으며, 막힌 상태에 들어간 후에는 이상을 포획하여 순환을 종료해야 합니다.
따라서interrupt () 를 사용하여 라인을 종료하는 가장 좋은 방법은 두 가지 상황을 모두 고려해야 한다.
public class ThreadSafe extends Thread {
public void run() {
while (!isInterrupted()) { //
try {
Thread.sleep(5*1000);//
} catch(InterruptedException e) {
e.printStackTrace();
break; // , break 。
}
}
}
}
질문:interupt 방법으로 네트워크 요청을 중단할 수 있습니까?왜?
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.