2012-01-11 2 views
0

나는 지정된 호스트 이름과 포트에서 들어오는 연결을 수신하는 앱을 가지고있다. 청취는 listen() (아래 참조) 방법으로 호출되며, 이는 입력 스트림을 처리하기 위해 ServerSocket.accept()을 사용하여 수신 연결을 계속 대기하고 새로운 Thread을 생성합니다.소켓에서 IO를 기다리는 동안 차단 된 스레드를 방해합니까?

private ServerSocket serverSocket; 
private Thread listenerThread; 

public void listen() throws IOException { 
    this.listenerThread = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      while (true) { 
       try { 
        Socket socket = TheServerClass.this.serverSocket.accept(); 
        // Create new thread to handle the incoming connection 
       } 
       catch (IOException exc) { } 
      } 
     } 
    }); 
    this.listenerThread.start(); 
} 

이제 실행을 중단하고 싶습니다. listenerThread. 그러나 this.listenerThread.interrupt()으로 전화하면이 기능이 작동하지 않습니다.
스레드를 중단하여 스레드를 중단시킬 수 있다고 생각했는데 왜 작동하지 않는 것입니까?

(주의 사항 : 가능한 솔루션은 this.serverSocket.close()를 사용하여 ServerSocket를 닫이지만, interrupt() 또는 뭔가 수행 할 수 있습니다?)

+0

표준 소켓을 사용할 때 소켓을 닫을 때만 가능합니다. 동일한 문제를 다루는 여기에 몇 가지 질문이 있습니다 (예 : http://stackoverflow.com/questions/1510403/how-to-unblock-a-thread-blocked-on-serversocket-accept –

+0

그것이 작동하지 않는다는 것은 무엇을 의미합니까? 예외를 던집니까? 아니면 그냥 계속 하시겠습니까? – medopal

+0

@medopal 스레드는 종료하지 않고 계속 실행됩니다. –

답변

1

전화 serverSocket.close(),

아직 IO를하고 있지 않기 때문에 내가 추측 - 당신은 그것을 방해 할 수 없으며 accept() 때문에이 과정을 중단 할 수 없습니다 예외 : InterruptedException를 포기하지 않습니다. 스레드가 인터럽트되었지만 사용자가 직접 확인해야하는 플래그 Thread.isInterrupted().

How can I interrupt a ServerSocket accept() method?을 참조하십시오.

+0

'accept()'가 인터럽트 될 수 없으므로 (내 의견으로는 좀 이상하지만, 그렇게 되려면) close()를 사용해야 겠지요. 도움을 청합니다! –

+0

도움을받을 수 없습니다. – polve

1

대답은 질문입니다. 소켓을 닫아야합니다. 그것은 serverSocket.close()을 사용하여 완료되었습니다. Thread.interrupt()은 소켓을 신경 쓰지 않습니다.

0

사용이 :

public class MyThread extends Thread { 

    private boolean stop; 
    private ServerSocket serverSocket; 

    public MyThread(ServerSocket ss) { 
     this.serverSocket = ss; 
     this.stop = false; 
    } 

    public void setStop() { 
     this.stop = true; 
     if (this.ss != null) { 
      this.ss.close(); 
     } 
    } 

    public void run() { 
     while (!stop) { 
      try { 
       Socket socket = serverSocket.accept(); 
       // Create new thread to handle the incoming connection 
      } 
      catch (IOException exc) { } 
     } 
    } 
} 

listen() 방법에서

그냥 스레드의 setStop() 메서드를 호출합니다.

+0

좋지 않습니다. 적어도'stop'을 volatile로 선언해야합니다. 그렇지 않으면 컴파일러가 다른 스레드가 다른 값을 볼 수 있도록 컴파일러가이를 최적화 할 수 있습니다. – ivant

관련 문제