1207-Thread: 스레드를 중지하는 방법

2953 단어
현재 구성 요소를 삭제할 때, 백엔드 스레드도 중단해야 합니다. 그렇지 않으면 메모리에서 실행될 것입니다. 이로 인해 메모리 유출이 발생합니다.
스레드 대상은 일회용 소모품에 속합니다. 일반적인 스레드가run 방법을 실행한 후에 스레드가 정상적으로 끝났습니다. 스레드가 끝난 후에 폐기되었습니다. 다시 start할 수 없고 하나의 스레드 대상만 새로 만들 수 있습니다.하지만 때로는 런 방법은 영원히 끝나지 않는다.예를 들어 프로그램에서 코드를 사용하여 Socket 감청 요청을 진행하거나 순환 처리가 필요한 다른 작업을 수행합니다.이런 상황에서, 일반적으로while 순환과 같은 순환에 이 임무들을 놓는다.라인을 끝내야 할 때 어떻게 라인을 종료합니까?
다음 세 가지 방법으로 스레드를 종료할 수 있습니다.
  • 종료 표지를 사용하여 라인을 정상적으로 종료시킵니다. 즉,run 방법이 완성된 후에 라인이 종료됩니다
  • interrupt() 방법으로 라인 끊기
  • stop방법을 사용하여 강제로 라인을 중지한다
  • 앞의 두 가지 방법 모두 라인의 정상적인 퇴출을 실현할 수 있지만 세 번째 방법은 컴퓨터의 전원을 끄는 것과 같이 안전하지 않은 방법이다.

    종료 플래그를 사용하여 스레드 종료


    하나의 변수를 사용하여 순환을 제어합니다. 예를 들어 가장 직접적인 방법은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 방법으로 네트워크 요청을 중단할 수 있습니까?왜?

    좋은 웹페이지 즐겨찾기