Events 停止主线程,直到JavaFX事件队列上的所有事件都已执行

Events 停止主线程,直到JavaFX事件队列上的所有事件都已执行,events,javafx,Events,Javafx,在调试应用程序时,我希望主线程在我使用 Platform.runLater(new Runnable()... ) 等待它被执行(即可见)。然而,这里有两个转折点: 首先,它实际上不是一个标准的、GUI驱动的JavaFX应用程序。它更像是一个脚本,时不时地显示和更新JavaFXStage。所以结构看起来像这样: public static void main(String [] args){ //do some calculations SomeView someView =

在调试应用程序时,我希望主线程在我使用

Platform.runLater(new Runnable()... )
等待它被执行(即可见)。然而,这里有两个转折点:

首先,它实际上不是一个标准的、GUI驱动的JavaFX应用程序。它更像是一个脚本,时不时地显示和更新JavaFXStage。所以结构看起来像这样:

public static void main(String [] args){
    //do some calculations
    SomeView someView = new SomeView(data); //SomeView is basically a wrapper for  a stage
    PlotUtils.plotView(someView) //displays SomeView (i.e. the stage)
    //do some more calculations
    someView.updateView(updatedData)
    //do some more calculations
}

public class SomeView {
    private static boolean viewUpdated = false;
    private ObservableList<....> observableData;
    public void updateView(Data data){
        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                observableData.addAll(data);
                boolean viewUpdated = true; 
            }
        });
    //If configured (e.g using boolean switch), wait here until
    //the Runnable has been executed and the Stage has been updated.
    //At the moment I am doing this by waiting until viewUpdated has been
    //set to true ... but I am looking for a better solution!
    }
}
publicstaticvoidmain(字符串[]args){
//做一些计算
SomeView SomeView=newsomeview(data);//SomeView基本上是阶段的包装器
PlotUtils.plotView(someView)//显示someView(即舞台)
//再做一些计算
更新视图(更新数据)
//再做一些计算
}
公共类SomeView{
私有静态布尔viewUpdated=false;
私人观察者观察数据;
公共无效更新视图(数据){
Platform.runLater(新的Runnable(){
@凌驾
公开募捐{
ObservereData.addAll(数据);
布尔值viewUpdated=true;
}
});
//如果已配置(例如使用布尔开关),请在此处等待,直到
//已执行Runnable,并且已更新阶段。
//目前,我正在等待视图更新完成
//设置为true…但我正在寻找更好的解决方案!
}
}
其次,禁用此“功能”应该很容易,即等待Runnable被执行(使用当前方法不会有问题,但也可以使用替代方法)

最好的方法是什么


例如,是否有类似于阻塞版本的东西来在JavaFX线程上执行可运行,或者是否有一种简单的方法来检查事件队列上的所有事件是否都已执行/事件队列是否为空……?

这是基于

基本思想是将
FutureTask
提交到
Platform.runLater()
,然后在
FutureTask
上调用
get()
<代码>获取()将一直阻止,直到任务完成:

// on some background thread:

Runnable runnable = () -> { /* code to execute on FX Application Thread */};
FutureTask<Void> task = new FutureTask<>(runnable, null);
Platform.runLater(task);
task.get();
并将所有呼叫替换为
Platform.runLater(…)
with
frontExec.execute(…)


根据需要的配置方式,您可以基于命令行参数或属性文件(或者,如果您使用的是依赖项注入框架,则可以注入它)有条件地创建
frontExec

这是基于

基本思想是将
FutureTask
提交到
Platform.runLater()
,然后在
FutureTask
上调用
get()
<代码>获取()
将一直阻止,直到任务完成:

// on some background thread:

Runnable runnable = () -> { /* code to execute on FX Application Thread */};
FutureTask<Void> task = new FutureTask<>(runnable, null);
Platform.runLater(task);
task.get();
并将所有呼叫替换为
Platform.runLater(…)
with
frontExec.execute(…)


根据需要的配置方式,您可以基于命令行参数或属性文件(或者,如果您使用的是依赖项注入框架,则可以注入它)有条件地创建
frontExec

这是基于

基本思想是将
FutureTask
提交到
Platform.runLater()
,然后在
FutureTask
上调用
get()
<代码>获取()
将一直阻止,直到任务完成:

// on some background thread:

Runnable runnable = () -> { /* code to execute on FX Application Thread */};
FutureTask<Void> task = new FutureTask<>(runnable, null);
Platform.runLater(task);
task.get();
并将所有呼叫替换为
Platform.runLater(…)
with
frontExec.execute(…)


根据需要的配置方式,您可以基于命令行参数或属性文件(或者,如果您使用的是依赖项注入框架,则可以注入它)有条件地创建
frontExec

这是基于

基本思想是将
FutureTask
提交到
Platform.runLater()
,然后在
FutureTask
上调用
get()
<代码>获取()
将一直阻止,直到任务完成:

// on some background thread:

Runnable runnable = () -> { /* code to execute on FX Application Thread */};
FutureTask<Void> task = new FutureTask<>(runnable, null);
Platform.runLater(task);
task.get();
并将所有呼叫替换为
Platform.runLater(…)
with
frontExec.execute(…)


根据需要如何配置,您可以基于命令行参数或属性文件(或者,如果您使用的是依赖项注入框架,则可以注入它)有条件地创建
frontExec

还有
platformpl.runAndWait()
使用倒计时锁存器,只要您不从JavaFX线程调用它

还有
PlatformImpl.runAndWait()
使用倒计时锁存器,只要您不从JavaFX线程调用它

还有
PlatformImpl.runAndWait()
使用倒计时闩锁,只要您不从JavaFX线程调用它

还有
PlatformImpl.runAndWait()
使用倒计时闩锁,只要您不从JavaFX线程调用它

您对“主线程”的定义是什么?JavaFX有自己的方法,这与传统上用于执行程序的
main(String[]args)
方法的应用程序线程不同。您几乎不想让JavaFX应用程序线程等待,因为这样整个应用程序都将冻结(例如,您通过平台发送的可运行程序都不会执行,应用程序也不会处理其他操作,如绘制或输入处理)。我不希望JavaFX线程等待,我希望主线程(或者通常是调用“Platform.runLater”的线程)等待。澄清一下,您的意思是您已经在某个地方启动了自己的后台线程,您正在从中调用
Platform.runLater(…)
。您想让这个后台线程等待传递给
runLater(…)
的runnable完成,对吗?是的,基本上这就是我的意思。。。除此之外,它不一定是