2014-10-24 2 views
0

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/

위에 링크 된 페이지는 매우 비슷한 문제에 대해 설명합니다. 이것이 내 문제가 닫히지 않는 여분의 스레드와 관련이 있다고 생각하는 이유입니다. 필요한 경우 더 많은 코드 및/또는 설명을 제공 할 수 있습니다. 이것을 읽어 주셔서 감사합니다.

+0

귀하의 문제는 API에 설명되어 있습니다. http://docs.oracle.com/javafx/2/api/javafx/application/Platform.html#exit() "실행중인 다른 비 데몬 스레드가없는 경우 Java VM이 종료됩니다." 어쩌면 당신은 람다를 사용하지 말고 당신이 나가고있는 쓰레드를 추적해서 출구에서 닫을 수 있습니까? – user2573153

답변

0

응용 프로그램을 즉시 종료하려면 System.exit()을 호출하면됩니다. 그러나 조금 깔끔하고 싶다면 Application.stop() 메서드를 재정 의하여 종료해야 모든 백그라운드 스레드를 종료해야합니다. Worker 및 Task 클래스를보고 백그라운드 스레드를 처리하려고 할 수 있습니다.

http://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm

+0

예, Platform.exit() 대신 System.exit (0)을 사용하면 프로그램이 완전히 중지됩니다. System.exit()을 다른 종료 메소드보다 덜 깨끗하게 만드는 것은 무엇입니까? 작업 관리자를 사용하여 프로세스를 종료하는 것과 동일합니까? – JTM

+0

System.exit (0)은 JVM을 종료합니다. 이것은 백그라운드 스레드가 해제 될 때 리소스에 액세스하려고 할 때 다양한 널 포인터 및 시스템 예외를 발생시키는 경우가 있습니다. 예를 들어 파일에 쓰는 백그라운드 스레드가있는 경우 System.exit()을 호출하면 문제가 발생할 수 있습니다. 대개 큰 문제는 아니지만 결과를 로깅하는 경우 충돌과 사용자 이탈을 구분하기가 어려운 많은 예외가 발생할 수 있습니다. –

관련 문제