2014-03-26 66 views
4

我正在編寫一個JavaFX應用程序,並且我的對象擴展了Task以提供遠離JavaFX GUI線程的併發性。JavaFX任務線程不終止

我的主類看起來是這樣的:

public class MainApp extends Application { 

@Override 
public void start(Stage stage) throws Exception { 
    Parent root = FXMLLoader.load(getClass().getResource("Sample.fxml"));   
    Scene scene = new Scene(root);  
    stage.setScene(scene); 
    stage.setOnCloseRequest(new EventHandler<WindowEvent>() { 
     public void handle(WindowEvent t) { 
      //I have put this in to solve the threading problem for now. 
      Platform.exit(); 
      System.exit(0); 
     } 
    }); 
    stage.show(); 
} 

public static void main(String[] args) { 
    launch(args); 
} 
} 

我的GUI控制樣品看起來像這樣(抽象略):

ExecutorService threadPool = Executors.newFixedThreadPool(2); 
private void handleStartButtonAction(ActionEvent event) { 
     MyTask task = new MyTask(); 
     threadPool.execute(task); 
} 

目前我的任務只是做一個睡眠和打印數字1通過10:

public class MyTask extends Task<String> { 

@Override 
protected String call() throws Exception { 
    updateProgress(0.1, 10); 
    for (int i=0;i<=10;i++) { 
     if (isCancelled()) { 
      break; 
     } 
     Thread.sleep(1000); 
     System.out.println(i); 
     updateProgress(i, 10); 
    } 
    return "Complete";  
} 
} 

我有的問題是一旦任務完成它顯示爲t儘管任務啓動的線程繼續運行。所以,當我通過按下「X」右上角退出JavaFX應用程序時,JVM將繼續運行,並且我的應用程序不會終止。如果你看看我的主類,我已經把System.exit()看起來解決了這個問題,但我知道這不是正確的方法。

有人可以建議我需要做什麼終止我的子線程,什麼是接受的方式做到這一點?即檢查它們是否完整,然後例如終止。

感謝

回答

4

JavadocsExecutors.newFixedThreadPool()狀態:

在池中的線​​程將一直存在,直到它明確地關閉。

同時檢查ExecutorServiceusage examples,他們小心總是關閉池。

您可能必須確保在您的應用程序的適當位置調用threadPool.shutdown()

3

Nikos提供的方法(調用關機)非常直接。

另一種方法是爲線程創建定義自己的線程工廠。在你的線程工廠中,創建線程守護進程線程。當所有非守護進程線程完成時(即,即使未顯式關閉ExecutorService的線程池,您的程序也會退出),JavaFX程序將停止。

ExecutorService threadPool = Executors.newFixedThreadPool(
    2, 
    new ThreadFactory() { 
     AtomicInteger a = new AtomicInteger(1); 

     public Thread newThread(Runnable r) { 
      Thread t = new Thread(r, "mythread-" + a.getAndIncrement()); 
      t.setDaemon(true); 
      return t; 
     } 
    } 
); 

守護進程線程不適合所有服務,有時顯式關閉處理更好。

守護線程工廠方法在JDK的一些地方使用。