2016-04-24 17 views
5

Un sacco di domande qui stanno chiedendo come mettere in pausa il thread JavaFX Application per un thread in background, ma io voglio il contrario!Attendere il thread di applicazione JavaFX per terminare la gestione degli eventi?

Sto provando a testare quanto tempo ci vuole per gestire una serie di input chiave. Sto usando la libreria di test Automaton per JavaFX e editor.type (chiave) genera un evento keypress che viene elaborato dall'applicazione. Ecco uno dei tanti tentativi:

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(); 

Tuttavia, sembra che l'FX Discussione applicazione potrebbe essere gestendo la FutureTask prima che gestisce il resto degli eventi di pressione.

TLDR: Voglio misurare con precisione quando il thread dell'applicazione JavaFX ha terminato la gestione dei quattro eventi keypress che ho generato.

Come posso fare questo? Grazie!

+0

si riferiscono a questa domanda: http://stackoverflow.com/questions/7939257/wait-until-all-threads-finish-their-work -in-java/36797569 # 36797569 –

risposta

2

Utilizzare ExecutorService e attendere fino a quando i thread sono terminati. Memorizza un timestamp di quando hai iniziato il servizio e poi confronta la differenza tra le due volte per ottenere la tua risposta.

Un semplice esempio su come utilizzare il 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

Grazie mille per la tua risposta! Ti dispiace se ti chiedo dell'approccio che hai menzionato? Sono in grado di generare input che vengono gestiti da FX EventHandlers, ma non so esattamente come questi eventi siano rappresentati negli interni di JavaFX prima che il thread dell'applicazione richiami i metodi handle() rilevanti nel mio programma. Avevo pensato che l'uso di Platform.runLater() avrebbe inserito un evento nella coda in ordine successivo (dopo la pressione dei tasti), ma ho sbagliato. Come dovrei usare un ExecutorService in questa situazione? Grazie! – rosstex

+0

Ho aggiunto un esempio di base su come utilizzare il servizio. Avrei bisogno di più tempo per scrivere uno più elaborato. – MSB

+0

Invece di scrivere un esempio di codice completamente nuovo, questa risposta potrebbe aiutarti ulteriormente se la mia risposta non è soddisfacente: http://stackoverflow.com/questions/33394428/javafx-version-of-executorservice. – MSB