JavaFX 中的多线程会挂起 UI

2022-09-01 23:31:08

我有一个简单的JavaFX 2应用程序,有2个按钮,上面写着“开始”和“停止”。当单击开始按钮时,我想创建一个后台线程,该线程将进行一些处理并更新UI(例如进度条)。如果单击停止按钮,我希望线程终止。

我尝试使用我从文档中收集的类来执行此操作,这将对此正常工作。但是,每当我单击“开始”时,UI都会冻结/挂起,而不是保持正常。javafx.concurrent.Task

她是主类中用于显示按钮的代码: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<ActionEvent>()
    {
        public void handle(ActionEvent event)
        {                
           handler.run(); 
        }
    });

    Button stop = new Button();
    stop.setText("Stop");
    stop.setOnAction(new EventHandler<ActionEvent>()
        {
             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.logSystem.out.println )

我做错了什么?


答案 1

Task实现 ,因此当您调用时,您实际上在UI线程中运行该方法。这将挂起 UI。Runnablehandler.run();call

您应该在后台线程中启动任务,通过执行程序或直接调用 。new Thread(handler).start();

这在javadocJavaFX并发教程中进行了解释(可能不是很清楚)。


答案 2

推荐