JavaFX를 사용하여 간단한 Tic-Tac-Toe 게임을 만들고 있습니다. 서버 - 클라이언트 연결을 초기화하기 위해 serverSelectHandler와 clientSelectHandler의 두 클래스가 있습니다. 서버 클래스는 연결을 설정하기 위해 ServerSocket을 만들고, 일반적인 소켓을 만든 다음 데이터 전송을 처리하는 Thread를 만듭니다. 클라이언트 클래스는 ServerSocket이없는 것을 제외하고는 동일합니다.네트워크로 연결된 JavaFX 응용 프로그램을 올바르게 종료하려면 어떻게합니까?
스레드가 작성되면 RemoteInputHandler 클래스와 연관됩니다. 이 클래스는 Runnable의 run() 메서드를 재정의 (override)합니다.
String input = netComm.reader.readLine();
while (input != null)
{
// Make a separate copy of the input string
String inputCopy = input;
// Post a work order to process the command on the GUI thread
Platform.runLater(() -> {handleRemote(inputCopy);});
// Get the next remote input
input = netComm.reader.readLine();
}
당신이 볼 수 있듯이,이 방법은 작업 지시를 대기열에 람다 표현식을 사용 : 여기에 추가 코드 블록이다. 이것이 내 문제를 일으키는 원인이 될 수 있다고 생각합니다.
문제는이 응용 프로그램의 인스턴스를 Platform.exit()이 완전히 종료하지 않는다는 것입니다. 창이 닫히지 만 프로세스는 백그라운드에서 계속 실행됩니다. ClientSelectHandler에서 스레드를 설정하지 않으면이 문제가 발생하지 않습니다. 그러나 이로 인해 클라이언트가 서버에서 보낸 명령을 무시하게됩니다.
http://jabahan.com/javafx-application-not-properly-closed-even-if-the-platform-exit-is-used/
위에 링크 된 페이지는 매우 비슷한 문제에 대해 설명합니다. 이것이 내 문제가 닫히지 않는 여분의 스레드와 관련이 있다고 생각하는 이유입니다. 필요한 경우 더 많은 코드 및/또는 설명을 제공 할 수 있습니다. 이것을 읽어 주셔서 감사합니다.
귀하의 문제는 API에 설명되어 있습니다. http://docs.oracle.com/javafx/2/api/javafx/application/Platform.html#exit() "실행중인 다른 비 데몬 스레드가없는 경우 Java VM이 종료됩니다." 어쩌면 당신은 람다를 사용하지 말고 당신이 나가고있는 쓰레드를 추적해서 출구에서 닫을 수 있습니까? – user2573153