JavaFX中的multithreading挂起了UI

我有一个简单的JavaFX 2应用程序,有2个按钮,分别是Start和Stop。 单击开始按钮时,我想创建一个后台线程,它将进行一些处理并在其进行时更新UI(例如进度条)。 如果单击停止按钮,我希望线程终止。

我试图使用javafx.concurrent.Task类来完成此操作,我从文档中收集这个类可以正常工作。 但是每当我单击“开始”时,UI就会冻结/挂起而不是保持正常。

她的主要Myprogram extends Application代码Myprogram extends Application类来显示按钮:

 public void start(Stage primaryStage) { final Button btn = new Button(); btn.setText("Begin"); //This is the thread, extending javafx.concurrent.Task : final MyProcessor handler = new MyProcessor(); btn.setOnAction(new EventHandler() { public void handle(ActionEvent event) { handler.run(); } }); Button stop = new Button(); stop.setText("Stop"); stop.setOnAction(new EventHandler() { public void handle(ActionEvent event) { handler.cancel(); } } ); // Code for adding the UI controls to the stage here. } 

这是MyProcessor类的代码:

 import javafx.concurrent.Task; public class MyProcessor extends Task { @Override protected Integer call() { int i = 0; for (String symbol : feed.getSymbols() ) { if ( isCancelled() ) { Logger.log("Stopping!"); return i; } i++; Logger.log("Doing # " + i); //Processing code here which takes 2-3 seconds per iteration to execute Logger.log("# " + i + ", DONE! "); } return i; } } 

非常简单,但只要我点击“开始”按钮,UI就会挂起,但控制台消息会继续显示( Logger.log只是System.out.println

我究竟做错了什么?

Task实现Runnable ,所以当你调用handler.run(); 你实际上在UI线程中运行call方法。 这会挂起UI。

您应该在后台线程中启动任务,可以通过执行new Thread(handler).start(); ,也可以通过调用new Thread(handler).start();

这在javadoc或JavaFX并发教程中解释(可能不是很清楚)。