2017-11-02 57 views
1

JavaFX 응용 프로그램을 사용하여 별도의 프로세스 (updater executable)를 실행하고 종료해야하는 경우가 있습니다. 나는 ProcessBuilder.command()을 사용하여 별도의 프로세스를 실행 중이며 하위 프로세스가 !isAlive()이 될 때 프로세스가 완전히 실행된다는 것을 확인합니다. 이 후 Window.getWindows().forEach(::dispose)System.exit(0)을 실행하여 응용 프로그램을 종료하려고합니다.JavaFX 응용 프로그램이 System.exit() 이후에 종료되지 않습니다.

System.exit(0) 호출 후 응용 프로그램이 중단되지만 별도의 프로세스가 실행되지 않으면 응용 프로그램이 올바르게 종료됩니다.

"자바 FX 애플리케이션 쓰레드"# 32 프리 오 = 5 os_prio = 0 TID = 0x000000001f4fe000 NID = 0x44d0되는 Object.wait()에서 [0x0000000023f4d000] 자바 : 여기

메인 스레드 스택 트레이스의 일부이다. lang.Thread.State : java.lang.Object.wait (네이티브 메소드)의 WAITING (오브젝트 모니터) java.lang.Thread.join (Thread.java:1252) - 잠김 < 0x00000006c21ac608> .lang.Thread). 에서 java.lang.Thread.join (Thread.java:1326) java.lang.ApplicationShutdownHooks.runHooks (ApplicationShutdownHooks.java:106) java.lang.ApplicationShutdownHooks $ 1.run (ApplicationShutdownHooks.java:46) java.lang.Shutdown.sequence에서 java.lang.Shutdown.runHooks (Shutdown.java:123)에서 에서 617,451,515,(Shutdown.java:167) 에 java.lang.Shutdown.exit (Shutdown.java:212) - 잠김 < 0x00000006c2148fb8> (java.lang.Class.Shutdown)의 java.lang.Runtime.exit (Runtime.java:109) java.lang.System.exit (System.java:971)에서

그래서 일부 ApplicationShutdownHooks 완성을위한 응용 프로그램 대기를 보인다. 응용 프로그램에 두 개의 후크가 추가되었지만이를 제거한 후 stacktrace는 동일하게 유지됩니다.

암시 적으로 어떤 후크를 추가 할 수 있습니까? 어쩌면 분리 된 프로세스가 다른 프로세스로 실행되어 하위 프로세스가 닫히기 전에 닫을 수 있습니까?

UPD :이 응용 프로그램은 실제로 전체 JavaFX 응용 프로그램이 아니라 JavaFX 부분이있는 AWT 응용 프로그램입니다.

답변

0

응용 프로그램 구조에 문제가 있습니다. 실제로는 JavaFX 구성 요소를 수동으로 시작한 Swing/AWT 응용 프로그램이었습니다. 따라서 Platform.exit() 또는 Systen.exit(0)이 호출되면 AWT 윈도우는 활성 상태를 유지하고 응용 프로그램이 완전히 종료되지 않도록합니다. Platform.exit()를 호출 응용 프로그램의 자바 FX의 일부를 닫보다

window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
window.dispose(); 
Platform.exit() 

과 : 이 경우 제대로 활성화 AWT 창을 폐기하고 Platform.exit()를 호출 할 필요가 있었다.

4

당신은 당신이 사용해야 자바 FX에서 응용 프로그램 종료 어떤 경우 : 예) (중지,

Platform.exit() 

사용이 방법은 모든 닫는 메소드를 호출하여 응용 프로그램을 만들 것입니다 당신이에 대한 자세한 내용을 볼 수 있습니다 여기 : Application JavaFX 8

문제의 원인이되는 코드 부분을 공유하지 않는 경우 이것이 도움이되는지 확인하십시오.

+0

JavaFX 응용 프로그램에서'System.exit'이 허용되지 않는다는 내용의 문서가 보이지 않습니다. 게시 한 링크는 실제로 라이프 사이클의 일부로 System.exit()에 대해 이야기하고 있습니다. – Thirler

+0

Platform.exit()을 사용해야한다고 말하는 것은 아니며, 사용하는 것이 더 바람직하다는 것입니다. System.exit() 만 다른 Java 응용 프로그램으로 사용할 수 있습니다. Platform.exit()는 exit() 할 수있는 더 깨끗한 방법을 가지고 있으며 파생 된 스레드와 같이 종료하기 전에 모든 문제를 해결해야합니다. – LMiranda

2

응용 프로그램이 모든 종료 후크가 완료되기를 기다리는 중입니다. 아직 후크가 있어야합니다.

runHooks 메서드는 응용 프로그램이 종료 될 때 자동으로 실행됩니다. 완료되면 응용 프로그램이 종료됩니다 (이 외에도 다른 정리 작업이 수행됩니다).아래 코드를 참조하십시오.

static void runHooks() { 
    Collection<Thread> threads; 
    synchronized(ApplicationShutdownHooks.class) { 
     threads = hooks.keySet(); 
     hooks = null; 
    } 

    for (Thread hook : threads) { 
     hook.start(); 
    } 
    for (Thread hook : threads) { 
     try { 
      hook.join(); 
     } catch (InterruptedException x) { } 
    } 
} 

각 후크는 시작되지 않은 Thread입니다. 종료하면 모든 스레드 (hook.start())가 시작되고 모두 완료/종료 될 때까지 대기합니다 (hook.join()).

stacktrace가 완료되지 않은 shutdownhook 스레드가 있음을 보여줍니다. 어떤 것을 찾아내는 지 알아 보자.

Thread.join() 방법은 this에 동기화하고 '잠금'라인은 스레드 개체가 문제가있는 당신을 알려줍니다

at java.lang.Thread.join(Thread.java:1252) 
    - locked <0x00000006c21ac608> (a java.lang.Thread) 
    at java.lang.Thread.join(Thread.java:1326) 

이 숫자는 객체의 고유 번호 (I 가상 메모리 ADRESS 생각)입니다 . 이 번호는 응용 프로그램의 전체 스레드 덤프에 있어야하며 그렇지 않은 경우 디버거를 사용하여 모든 종료 후크 (java.lang.ApplicationShutdownHooks#hooks)가있는 집합의 개체를 찾을 수 있습니다.

이 다음에이 스레드를보고 기다리고있는 것을 볼 수 있습니다.

사용자가 사용하는 라이브러리 중 일부는 사용자 자신의 후크가 아니라 shutdownhooks를 추가 할 수도 있습니다.