【问题标题】:Wait for JavaFX Application Thread to finish handling events?等待 JavaFX 应用程序线程完成事件处理?
【发布时间】:2016-08-17 16:53:54
【问题描述】:

这里有很多问题是关于如何暂停 JavaFX 应用程序线程以作为后台线程,但我想要相反的!

我正在尝试测试完全处理一系列关键输入需要多长时间。我正在为 JavaFX 使用Automaton 测试库,并且 editor.type(key) 生成一个按键事件,该事件由应用程序处理。这是众多尝试之一:

long start = System.nanoTime();

editor.type(AGUtils.LEFT_ARROW);
editor.type(AGUtils.LEFT_ARROW);
editor.type(AGUtils.RIGHT_ARROW);
editor.type(AGUtils.RIGHT_ARROW);

FutureTask<Callable> t = new FutureTask<>(...);
Platform.runLater(t);

while (!t.isDone()) { } // wait for the FutureTask to be called

long end = System.nanoTime();

但是,FX 应用程序线程似乎在处理其余按键事件之前可能正在处理 FutureTask。

TLDR:我想精确测量 JavaFX 应用程序线程何时完成对我生成的四个按键事件的处理。

我该怎么办?谢谢!

【问题讨论】:

标签: java multithreading testing javafx concurrency


【解决方案1】:

使用ExecutorService 并等待线程完成。存储您启动服务的时间戳,然后比较两次之间的差异以获得答案。

一个关于如何使用ExecutorService的简单示例:

ExecutorService taskExecutor = Executors.newFixedThreadPool(4);
while(...) {
  taskExecutor.execute(new MyTask());
}
taskExecutor.shutdown();
try {
  taskExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
  ...
}

【讨论】:

  • 非常感谢您的回复!介意我问一下你提到的方法吗?我能够生成由 FX EventHandlers 处理的输入,但在应用程序线程在我的程序中调用相关的 handle() 方法之前,我并不完全知道这些事件在 JavaFX 的内部是如何表示的。我曾认为使用 Platform.runLater() 会以连续的顺序(在按键之后)将事件插入队列,但我错了。在这种情况下,我将如何使用 ExecutorService?谢谢!
  • 我添加了一个关于如何使用该服务的基本示例。我需要更多时间来写一篇更详细的文章。
  • 如果我的答案不令人满意,这个答案可能会进一步帮助您,而不是编写一个全新的代码示例:stackoverflow.com/questions/33394428/…
  • 谢谢,我会仔细倾倒他们两个!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-11
  • 1970-01-01
  • 2014-12-05
  • 1970-01-01
相关资源
最近更新 更多