Thread.interrupt()를 사용하여 스레드 중단
목록 A에 설명된 대로 Thread.interrupt() 메서드는 실행 중인 스레드를 중단하지 않습니다. 이 메서드가 실제로 수행하는 작업은 스레드가 차단될 때 인터럽트 신호를 발생시켜 스레드가 차단된 상태를 종료할 수 있도록 하는 것입니다. 더 정확하게 말하면, 스레드가 Object.wait, Thread.join 및 Thread.sleep 세 가지 메소드 중 하나에 의해 차단되면 인터럽트 예외(InterruptedException)를 수신하여 차단된 상태를 조기에 종료합니다.
따라서 위의 방법으로 스레드가 차단된 경우 스레드를 중지하는 올바른 방법은 공유 변수를 설정하고 Interrupt()를 호출하는 것입니다(변수를 먼저 설정해야 한다는 점에 유의하세요). 스레드가 차단되지 않은 경우 Interrupt() 호출은 효과가 없습니다. 그렇지 않으면 스레드는 예외를 발생시키고(스레드는 이 상황을 미리 처리할 준비가 되어 있어야 함) 차단된 상태에서 벗어납니다. 두 경우 모두 결국 스레드는 공유 변수를 확인한 다음 중지합니다. 목록 C는 이 기술을 설명하는 예입니다.
Listing C class Example3 extends Thread { volatile boolean stop = false; public static void main( String args[] ) throws Exception { Example3 thread = new Example3(); System.out.println( "Starting thread..." ); thread.start(); Thread.sleep( 3000 ); System.out.println( "Asking thread to stop..." ); thread.stop = true;//如果线程阻塞,将不会检查此变量 thread.interrupt(); Thread.sleep( 3000 ); System.out.println( "Stopping application..." ); //System.exit( 0 ); } public void run() { while ( !stop ) { System.out.println( "Thread running..." ); try { Thread.sleep( 1000 ); } catch ( InterruptedException e ) { System.out.println( "Thread interrupted..." ); } } System.out.println( "Thread exiting under request..." ); } }
목록 C의 Thread.interrupt()가 호출되면 스레드는 예외를 수신하고 차단된 상태를 벗어나 중지해야 한다고 결정합니다. 위 코드를 실행하면 다음과 같은 결과가 나옵니다.
Starting thread... Thread running... Thread running... Thread running... Asking thread to stop... Thread interrupted... Thread exiting under request... Stopping application...
위는 Java에서 실행 중인 스레드를 중단하는 방법(2)에 대한 내용입니다. 자세한 내용은 PHP 중국어 웹사이트를 참고하세요. (www.php.cn) !