Multithreading JavaFX使用线程和GUI

Multithreading JavaFX使用线程和GUI,multithreading,user-interface,javafx,task,Multithreading,User Interface,Javafx,Task,我在使用JavaFX和线程时遇到问题。基本上我有两个选择:使用任务或平台.runLater。据我所知,Platform.runLater应该用于简单/简短的任务,而Task应该用于较长的任务。但是,我不能使用它们中的任何一个 当我调用线程时,它必须在任务执行过程中弹出一个验证码对话框。当使用任务时,它会忽略我显示新对话框的请求。。。它不让我去创造一个新的舞台 另一方面,当我使用Platform.runLater时,它允许我显示一个对话框,但是,程序的主窗口会冻结,直到显示弹出对话框为止 我需要任

我在使用JavaFX和线程时遇到问题。基本上我有两个选择:使用
任务
平台.runLater
。据我所知,
Platform.runLater
应该用于简单/简短的任务,而
Task
应该用于较长的任务。但是,我不能使用它们中的任何一个

当我调用
线程
时,它必须在任务执行过程中弹出一个验证码对话框。当使用
任务时,它会忽略我显示新对话框的请求。。。它不让我去创造一个新的舞台

另一方面,当我使用
Platform.runLater
时,它允许我显示一个对话框,但是,程序的主窗口会冻结,直到显示弹出对话框为止

我需要任何解决办法。如果有人知道如何处理这个问题,或者有过类似的经验,并找到了解决方案,我期待着您的回复

如果您想在后台执行某些操作,请使用JavaFX应用程序线程中的
工作者(
任务
服务

如果要在JavaFX应用程序线程上执行某些操作,请从后台线程使用
Platform.runLater


正如puce所说,您必须使用
任务
服务
来完成您需要在后台完成的事情。和
Platform.runLater
从后台线程在JavaFX应用程序线程中执行操作

您必须同步它们,其中一种方法是使用类
CountDownLatch

以下是一个例子:

Service<Void> service = new Service<Void>() {
        @Override
        protected Task<Void> createTask() {
            return new Task<Void>() {           
                @Override
                protected Void call() throws Exception {
                    //Background work                       
                    final CountDownLatch latch = new CountDownLatch(1);
                    Platform.runLater(new Runnable() {                          
                        @Override
                        public void run() {
                            try{
                                //FX Stuff done here
                            }finally{
                                latch.countDown();
                            }
                        }
                    });
                    latch.await();                      
                    //Keep with the background work
                    return null;
                }
            };
        }
    };
    service.start();
服务=新服务(){
@凌驾
受保护的任务createTask(){
返回新任务(){
@凌驾
受保护的Void调用()引发异常{
//背景工作
最终倒计时闩锁=新倒计时闩锁(1);
Platform.runLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
//在这里做外汇交易
}最后{
倒计时();
}
}
});
satch.wait();
//继续做背景工作
返回null;
}
};
}
};
service.start();

现在回答这个问题已经太迟了,但是对于那些有错误的人来说,下面是解决方案XD

你可以用一根线

对线程中的
runnable
runlater
使用lambda表达式

Thread t = new Thread(() -> {
        //Here write all actions that you want execute on background

        Platform.runLater(() -> {
            //Here the action where is finished the actions on background
        });
    });
t.start();

我创建了一个Worker(任务)。一旦我需要显示一个弹出窗口,我就调用Platform.runLater,但是我需要等待响应(这是输入对话框),但是如果我创建了新线程(Platform.runLater),它就不会等待响应,而Worker会继续。。。如何处理它。也许有一种方法可以暂停工作线程等待Platform.runLater的输入,然后继续…?这正是我要搜索的。非常感谢你!可能重复的