2016-07-13 5 views
0

다음과 같은 설정이 있습니다. 먼저 메인 프레임으로 Swift GUI가 있습니다. 그런 다음 버튼을 눌러 새 스레드를 시작하겠습니다. 단추를 다시 누르면 스레드가 멈춰야합니다. 스레드가 TCP-연결을 incomming을 기다리고 있습니다 : 들어오는 연결을 기다리는 Java 스레드를 인터럽트하는 방법

ServerSocket clientSocket = welcomeSocket.accept(); 

지금 내가 스레드를 중지 GUI thread.interrupt();에 전화를 시도했지만 인해 .accept를 작동하지 않는 것은 차단 시스템 호출이다. 새 연결을 기다리는 동안 스레드를 중지하려면 어떻게해야합니까? thread.stop()은 사용하지 않기 때문에 사용하지 않으려합니다.

아무 해결책이 있습니까?

답변

0

아무 것도 연결하지 않은 경우 setSoTimeout(1000)을 사용하여 accept() 호출이 1 초 후에 시간 초과되도록 (java.net.SocketTimeoutException 예외 발생) 할 수 있습니다. 그런 다음 루프에서 다음과 같이 스레드 신호를 확인할 수 있습니다.

try (ServerSocket serverSocket = new ServerSocket(8080)) { 
    serverSocket.setSoTimeout(1000); 
    //active is a volatile boolean manipulated by the control thread 
    while (active) { 
     try { 
      Socket s = serverSocket.accept(); 
      somebodyConnected(s); //do something important here 
     catch (java.net.SocketTimeoutException) {} //expected 
    } 
    System.out.println("exiting"); 
} //the try-with-resources ensures the ServerSocket is gracefully closed 
관련 문제