等待JavaFX应用程序线程完成处理事件?
这里有很多问题都是关于如何暂停后台线程的JavaFX应用程序线程,但我想要的是相反的!等待JavaFX应用程序线程完成处理事件?
我想测试一系列关键输入需要多长时间才能完全处理。我正在使用用于JavaFX的Automaton测试库,并且editor.type(key)生成由应用程序处理的keypress事件。这里有许多的尝试之一:
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应用程序线程何时完成处理我生成的四个按键事件。
我该怎么办?谢谢!
使用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事件处理程序处理的输入,但我并不完全知道在应用程序线程在我的程序中调用相关的handle()方法之前,这些事件是如何在JavaFX的内部表示的。我曾经想过使用Platform.runLater()会按顺序(在按键之后)插入一个事件到队列中,但我错了。如何在这种情况下使用ExecutorService?谢谢! – rosstex
我添加了一个关于如何使用该服务的基本示例。我需要更多的时间来写一个更详细的。 – MSB
而不是写一个全新的代码示例这个答案可能会帮助你进一步如果我的答案不令人满意:http://stackoverflow.com/questions/33394428/javafx-version-of-executorservice。 – MSB
是指这样一个问题:http://stackoverflow.com/questions/7939257/wait-until-all-threads-finish-their-work -in-java/36797569#36797569 –