2014-06-27 58 views
1

我正在尋找類似的例子來解決這個問題。我們有一個JavaFX應用程序,它通過運行以下代碼的線程運行一些GUI更新:ScheduledExecutorService :: scheduleAtFixedRate如何在JavaFX Runtime退出時終止預定的線程?

這與其他一些問題類似。我認爲是最像我的情況這兩個是這些:

我需要解決的問題,但是,關於下一個步驟。我的目標是用於嵌入式應用程序,並且沒有機會手動終止JVM任務或其他簡單答案等。恐怕重新啓動是爲嚴重的事情保留的。

我們需要確保所有線程都以有序的方式關閉。我正在尋找的是某種回撥或事件,讓我註冊清理例程以關閉我的東西

我以爲在基類中應該有'東西',JavaFX javafx.application.Application這樣做。

是當有從我FXMLController停止我可能會使用或者我可以註冊Stop方法的東西被稱爲?

目前,當我從Netbeans運行我的JavaFX應用程序時,JVM進程仍然存在。這會停止任何進一步的構建腳本並鎖定JAR文件。 Netbeans給你一個殺死任務的選項。真正的解決方案意味着應用程序/ JVM按順序和整齊地關閉。

更新)......我看着你使用啓動的JavaFX應用程序的javafx.Application類。我實現了一個Stop()方法。在這裏,我確定我已撥打平臺出口()...

///// 
// @see 
// -- http://docs.oracle.com/javafx/2/api/javafx/application/Application.html#stop%28%29 
// 
public void stop() 
{ 
    Platform.exit(); 
} 

從NetBeans中運行時,這並不能治癒的問題。有時需要單擊停止[X]按鈕兩次,但當您使用「停止」按鈕時,該過程會停止。如果您對進度感興趣,則會報告爲bug:[Bug 245284],這裏有一個小時鐘示例來演示此問題。當您關閉該窗口時,NetBeans進程運行面板仍爲'正在運行'。您無法構建,因爲JAR文件已被鎖定。至少我們知道手動殺死開發程序。

  • 建議歡迎。 。 。

回答

2

我有一個部分解決方案,以涵蓋陷入這種情況的同胞開發人員。在您的JavaFX應用程序中聲明stop()方法(Netbeans Maven JavaFX模板稱爲「MainApp」)。當然有問題,但首先是方法。

停止叫你的程序結束。我打電話給平臺。 退出()以關閉JavaFX運行時。我已經添加了一個調用來關閉其他活動的Executor線程,我現在將它保存在列表中,以測試解決方案。

public class MainApp extends Application 
{ 

    @Override 
    public void start(Stage stage) throws Exception 
    { 
     ..... 
    } 

     /** 
      * Close down the application 
      * @see 
      * -- http://docs.oracle.com/javafx/2/api/javafx/application/Application.html#stop%28%29 
      **/ 
     @Override 
     public void stop() 
     { 
      Platform.exit(); 
      for(ScheduledExecutorService sched : activeExecutorServices) 
      { 
       sched.shutdown(); 
      } 
     } 

}//MainAppl class 

所以通過註釋出調用關機和運行JavaFX的我的程序,該應用程序完成,但不會退出,和Netbeans顯示正在運行的任務。您需要手動點擊Netbeans中的kill按鈕。

取消註釋shutdown()調用。當JavaFX應用程序退出時,它也會從Netbeans運行作業中消失。這似乎是一個解決方案。

剩下的問題:

  1. 什麼是平臺之間的正確順序。 exit()and shutdown()?
  2. 對於多個ScheduledExecutorService,使用哪種順序關閉它們是否有關係? LIFO或FIFO?
  3. 有沒有更好的方法?
  4. 應該Netbeans能夠檢測到'過程溢出'並報告這是一個問題。至少讓你我可以選擇忽略它或修復程序。

Hopefyully,這將有助於誰面臨:-)

2

類似的問題,你可以使用setOnCloseRequest

@Override 
public void start(Stage primaryStage) { 
    primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() { 
     @Override 
     public void handle(WindowEvent event) { 
      ThreadPool.shutdown(); 
     } 
    }); 

    initGui(primaryStage); 
    initData(); 
} 
+0

這只是工作,如果關閉階段和退出應用程序的下一個人是完全一樣的事情,這不適用於所有應用程序。 – Pablo