2016-04-24 137 views
5

這裏有很多問題都是關於如何暫停後臺線程的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應用程序線程何時完成處理我生成的四個按鍵事件。

我該怎麼辦?謝謝!

+0

是指這樣一個問題:http://stackoverflow.com/questions/7939257/wait-until-all-threads-finish-their-work -in-java/36797569#36797569 –

回答

2

使用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) { 
    ... 
} 
+0

非常感謝你的迴應!介意我問你提到的方法嗎?我能夠生成FX事件處理程序處理的輸入,但我並不完全知道在應用程序線程在我的程序中調用相關的handle()方法之前,這些事件是如何在JavaFX的內部表示的。我曾經想過使用Platform.runLater()會按順序(在按鍵之後)插入一個事件到隊列中,但我錯了。如何在這種情況下使用ExecutorService?謝謝! – rosstex

+0

我添加了一個關於如何使用該服務的基本示例。我需要更多的時間來寫一個更詳細的。 – MSB

+0

而不是寫一個全新的代碼示例這個答案可能會幫助你進一步如果我的答案不令人滿意:http://stackoverflow.com/questions/33394428/javafx-version-of-executorservice。 – MSB