> Java > java지도 시간 > Java에서 실행 중인 스레드를 중단하는 방법(3)

Java에서 실행 중인 스레드를 중단하는 방법(3)

黄舟
풀어 주다: 2016-12-30 13:22:13
원래의
1254명이 탐색했습니다.

I/O 작업 인터럽트

그런데 I/O 작업이 진행되는 동안 스레드가 차단되면 어떻게 될까요? I/O 작업은 특히 네트워크 애플리케이션이 관련된 경우 상당한 시간 동안 스레드를 차단할 수 있습니다. 예를 들어, 서버는 요청을 기다려야 할 수도 있고, 네트워크 애플리케이션은 원격 호스트의 응답을 기다려야 할 수도 있습니다.

채널(Java 1.4에 도입된 새로운 I/O API)을 사용하는 경우 차단된 스레드는 ClosedByInterruptException 예외를 수신합니다. 이 경우 코드의 논리는 세 번째 예와 동일하며 예외만 다릅니다.

그러나 Java 1.0 이전에 존재하고 더 많은 작업이 필요한 기존 I/O를 사용하고 있을 수 있습니다. 이 경우 스레드가 차단된 상태를 종료하지 않기 때문에 Thread.interrupt()가 작동하지 않습니다. 목록 D에서는 이 동작을 설명합니다. Interrupt()가 호출되더라도 스레드는 차단된 상태를 종료하지 않습니다.

Listing D
import java.io.*;
class Example4 extends Thread {
  public static void main( String args[] ) throws Exception {
    Example4 thread = new Example4();
   System.out.println( "Starting thread..." );
   thread.start();
   Thread.sleep( 3000 );
   System.out.println( "Interrupting thread..." );
   thread.interrupt();
   Thread.sleep( 3000 );
   System.out.println( "Stopping application..." );
   //System.exit( 0 );
  }
  public void run() {
   ServerSocket socket;
    try {
      socket = new ServerSocket(7856);
    } catch ( IOException e ) {
     System.out.println( "Could not create the socket..." );
      return;
    }
    while ( true ) {
     System.out.println( "Waiting for connection..." );
      try {
       Socket sock = socket.accept();
      } catch ( IOException e ) {
      System.out.println( "accept() failed or interrupted..." );
      }
    }
  }
}
로그인 후 복사

다행히 Java 플랫폼에서는 스레드를 차단하는 소켓의 close() 메소드를 호출하여 이러한 상황에 대한 솔루션을 제공합니다. 이 경우 스레드가 I/O 작업에 의해 차단되면 스레드는 InterruptedException을 발생시키기 위해 Interrupt() 메서드를 사용하는 것과 매우 유사한 SocketException을 수신합니다.

유일하게 주의할 점은 소켓에 대한 참조가 존재해야 한다는 것입니다. 이 방법으로만 close() 메서드를 호출할 수 있습니다. 이는 소켓 개체를 공유해야 함을 의미합니다. 목록 E에서는 이러한 상황을 설명합니다. 실행 논리는 이전 예제와 동일합니다.

Listing E
import java.net.*;
import java.io.*;
class Example5 extends Thread {
  volatile boolean stop = false;
  volatile ServerSocket socket;
  public static void main( String args[] ) throws Exception {
    Example5 thread = new Example5();
   System.out.println( "Starting thread..." );
   thread.start();
   Thread.sleep( 3000 );
   System.out.println( "Asking thread to stop..." );
   thread.stop = true;
   thread.socket.close();
   Thread.sleep( 3000 );
   System.out.println( "Stopping application..." );
   //System.exit( 0 );
  }
  public void run() {
    try {
      socket = new ServerSocket(7856);
    } catch ( IOException e ) {
     System.out.println( "Could not create the socket..." );
      return;
    }
    while ( !stop ) {
     System.out.println( "Waiting for connection..." );
      try {
       Socket sock = socket.accept();
      } catch ( IOException e ) {
      System.out.println( "accept() failed or interrupted..." );
      }
    }
   System.out.println( "Thread exiting under request..." );
  }
}
로그인 후 복사

다음은 목록 E의 코드를 실행한 후의 출력입니다.

Starting thread...
Waiting for connection...
Asking thread to stop...
accept() failed or interrupted...
Thread exiting under request...
Stopping application...
로그인 후 복사

멀티스레딩은 강력한 도구이지만 일련의 어려움을 안겨줍니다. 그 중 하나는 실행 중인 스레드를 중단하는 방법입니다. 올바르게 구현되면 위의 기술을 사용하여 스레드를 중단하는 것이 Java 플랫폼에서 이미 제공되는 인라인 작업을 사용하는 것보다 간단합니다.

위 내용은 Java에서 실행 중인 스레드를 중단시키는 방법(3)에 대한 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿