在多线程的JavaFX挂UI(Multithreading in JavaFX hangs the

2019-07-19 04:24发布

我有一个简单的JavaFX 2个应用程序,和两个按钮,称启动和停止。 当点击启动按钮,我想因为它去一起创建一个后台线程,这将做一些处理,并更新用户界面(例如进度条)。 如果点击停止按钮,我想线程终止。

我已经试过这用做javafx.concurrent.Task这是我从文档收集类将工作得很好这一点。 但每当我点击开始,在UI冻结/挂起而不是停留正常。

她是从主代码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.log简单地做System.out.println

我究竟做错了什么?

Answer 1:

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

你应该开始在后台线程任务,无论是通过遗嘱执行人或只需调用new Thread(handler).start();

这是在解释(也许不是很清楚) 的Javadoc或JavaFX的并发教程 。



文章来源: Multithreading in JavaFX hangs the UI