이 기사에서는 Java 스레드 스레드의 인터럽트 인터럽트 메커니즘에 대해 이야기 할 것입니다.
인터럽트 스레드
스레드의 thread.interrupt () 메소드는 스레드를 방해하는 것입니다. 스레드의 인터럽트 상태 비트, 즉 true로 설정됩니다. 중단 된 스레드가 사망하는지 여부, 새로운 작업을 기다리거나 다음 단계로 계속 실행되는 것은 프로그램 자체에 따라 다릅니다. 스레드는이 인터럽트 플래그를 때때로 감지하여 스레드를 중단 해야하는지 여부를 결정합니다 (인터럽트 플래그가 사실인지 여부). 정지 메소드와 같은 실행 스레드를 방해하지 않습니다.
스레드가 중단되었는지 확인하십시오
스레드가 인터럽트 요청을 보냈는지 여부를 결정하려면 스레드를 사용하십시오. 대신, 스레드를 사용하지 마십시오. 다음은 루프에있을 때 스레드의 인터럽트 방법입니다.
while (! thread.currentThread (). Islinterrupted () && more 작업) {더 많은 작업을 수행합니다}인터럽트 상태 플래그
인터럽트 인터럽트 메커니즘에는 다음과 같은 방법이 있습니다.
따라서 인터럽트 인터럽트 메커니즘은 실제로 현재 스레드를 방해하는 것이 아니라 인터럽트 마크 업의 변화입니다. 먼저 예제로 테스트합시다.
공개 클래스 인터럽트 테스트 {// 여기에 소비 된 시간은 개인 정적 긴 시간을 인쇄하는 데 사용됩니다 = 0; 개인 정적 void resettime () {time = system.currenttimeMillis (); } private static void printContent (String content) {System.out.println (content + "time :" + (System.CurrentTimeMillis () - Time)); } public static void main (String [] args) {test1 (); } private static void test1 () {Thread1 Thread1 = new Thread1 (); thread1.start (); // 3 초의 지연 후 인터럽트를 인터럽트하십시오. {thread.sleep (3000); } catch (InterruptedException e) {e.printstacktrace (); } thread1.interrupt (); PrintContent ( "실행 인터럽트"); } private static class stread1은 스레드 {@override public void run () {resettime (); int num = 0; while (true) {if (islerrupted ()) {printContent ( "현재 스레드가 중단되었습니다"); 부서지다; } num ++; if (num % 100 == 0) {printContent ( "num :" + num); }}}}}}}}위의 코드는 Thread1 스레드를 시작하고 Thread1 스레드의 while 루프에 1에 1을 연속적으로 추가하고 100 개 배수마다 한 번씩 인쇄하는 것입니다 (인쇄가 너무 빨리 막을 수 없습니다). 그런 다음 3000 밀리 초 동안 수면 후 주 스레드는 Thread1 스레드의 인터럽트 방법을 호출합니다. 그런 다음 출력을 살펴 보겠습니다.
인터럽트 인터럽트
약 3000 밀리 초, 즉 메인 스레드가 잠이 자면 스레드 1 스레드가 중지되고 스레드 1 스레드가 중지되므로 while 루프의 중단 메소드가 True를 반환하기 때문에 스레드 1 스레드가 중지된다는 것을 알 수 있습니다. 즉, 인터럽트의 역할과 여기서 중단됩니다. 여기서 중단됩니다. 부울 변수를 유지하는 SETXX 및 GETXX의 역할과 동일합니다.
인터럽트 예외 처리
물론 인터럽트 메커니즘은 단순히 인터럽트 상태 비트의 변경 및 감지 일뿐 만 아니라 인터럽트 예외도 처리 할 수 있습니다. 우리는 Thread.sleep () 메소드가 인터럽트 예외를 포착해야한다는 것을 알고 있습니다. 따라서 수면 지연을 추가하고 시도해 봅시다.
while (true) {if (islerrupted ()) {printContent ( "현재 스레드가 중단되었습니다"); 부서지다; } num ++; // Sleep Try {Thread.Sleep (1); } catch (InterruptedException e) {e.printstacktrace (); } if (num % 100 == 0) {printContent ( "num :" + num); }}출력 결과를 살펴 보겠습니다.
인터럽트 인터럽트
여기서 우리는 수면 후에 출력 NUM 값이 상당히 작다는 것을 알게 될 것입니다 (NUM은 자고 있지 않을 때 10 억에 이릅니다. CPU가 간단한 작업을 매우 빨리 수행하는 것으로 보입니다). 하하,하지만 이것은 요점이 아닙니다. 요점은 출력 예외 후에, 중단 된 출력이 False를 반환하고 Thread1 스레드가 계속 실행되고 While 루프를 종료하지 않는다는 것입니다. 그렇다면 왜 이거야? 우리는 방금 잠을 추가했습니다.
Thread1 스레드에서 스레드의 수면, 결합 메소드, 객체 대기, 조건 대기 등과 같은 인터럽트 꺼짐 예외 예외를 포착 해야하는 스레드 1 스레드에 작동이있는 경우, 인터럽트 픽스크 예외를 포착하도록 강요하고 스레드 1. 인터럽트 메소드가 호출되면 스레드 1 스레드에 중단 예외를 던집니다. 그런 다음 while 루프 에서이 예외는 잡히면이 예외가 발생한 후 스레드 인터럽트 플래그가 즉시 False로 재설정됩니다. 따라서 다음 번에 중단되면 while 루프가 허위로 결정되면 파손되지 않으면 Where 루프가 계속 실행됩니다.
따라서 인터럽트 () 메소드는 스레드 스레드에 실행 메소드에 코드가 있는지에 따라 다른 작업을 수행합니다.
인터럽트의 응용 시나리오
일반적으로 인터럽트는 스레드 실행의 루프 마크 판단에 적합합니다.
while (! isterrupted ()) {...} 그러나이 루프에 막힘이있는 경우 스레드는 다음 IS 중단 태그를 판단 할 수 없으며 인터럽트 () 메소드가 호출 되더라도 루프를 종료 할 수 없으며 스레드는 종료 할 수 없습니다. 예를 들어
while (! isterrupted ()) {... while (true) {// 스레드가 여기에 붙어 있습니다. 중단 메커니즘은}}}}에 응답 할 수 없습니다.이런 식으로 인터럽트는 무력하며 스레드는 계속 실행되며 중단 및 중지되지 않습니다.
내 github- javatest를 볼 수있는 테스트 예제
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.