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并发教程中解释(可能不是很清楚)。