2016-04-24 7 views
5

यहां पर बहुत सारे प्रश्न पृष्ठभूमि थ्रेड के लिए JavaFX एप्लिकेशन थ्रेड को रोकने के तरीके के बारे में पूछ रहे हैं, लेकिन मुझे विपरीत चाहिए!घटनाओं को संभालने के लिए JavaFX अनुप्रयोग थ्रेड के लिए प्रतीक्षा करें?

मैं परीक्षण करने की कोशिश कर रहा हूं कि मुख्य इनपुट की श्रृंखला पूरी तरह से संभालने में कितनी देर लगती है। मैं JavaFX के लिए Automaton परीक्षण लाइब्रेरी का उपयोग कर रहा हूं, और editor.type (कुंजी) एक कुंजीपटल ईवेंट उत्पन्न करता है जो एप्लिकेशन द्वारा संसाधित हो जाता है। यहाँ कई प्रयासों में से एक है:

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

हालांकि, यह विदेशी मुद्रा आवेदन थ्रेड FutureTask से निपटने हो सकता है इससे पहले कि यह कुंजी दबाने की घटनाओं के बाकी संभालती है लगता है।

टीएलडीआर: जब मैं जावाएफएक्स एप्लीकेशन थ्रेड उत्पन्न करता हूं तो चार सटीक घटनाओं को संभालने के दौरान मैं ठीक से मापना चाहता हूं।

मैं इसके बारे में कैसे जा सकता हूं? धन्यवाद!

+0

इस सवाल का संदर्भ लें: http://stackoverflow.com/questions/7939257/wait-until-all-threads-finish-their-work -इन-जावा/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

आपकी प्रतिक्रिया के लिए बहुत बहुत धन्यवाद! अगर मैं आपके द्वारा बताए गए दृष्टिकोण के बारे में पूछता हूं तो मन? मैं एफएक्स इवेंट हैंडलर द्वारा संचालित इनपुट उत्पन्न करने में सक्षम हूं, लेकिन मुझे पता नहीं है कि एप्लिकेशन थ्रेड मेरे प्रोग्राम में प्रासंगिक हैंडल() विधियों को कॉल करने से पहले जावाफैक्स के आंतरिक में उन घटनाओं का प्रतिनिधित्व कैसे किया जाता है। मैंने Platform.runLater() का उपयोग करके सोचा था कि लगातार क्रम में (कुंजीपेशियों के बाद) में कतार में एक ईवेंट डालेंगे, लेकिन मैं गलत था। मैं इस स्थिति में एक निष्पादक सेवा का उपयोग कैसे करूं? धन्यवाद! – rosstex

+0

मैंने सेवा का उपयोग करने के तरीके पर एक बुनियादी उदाहरण जोड़ा। मुझे एक और विस्तृत लिखने के लिए और अधिक समय चाहिए। – MSB

+0

एक पूरी तरह से नया कोड उदाहरण लिखने के बजाय यह उत्तर आगे बढ़ने में आपकी सहायता कर सकता है यदि मेरा उत्तर संतोषजनक नहीं है: http://stackoverflow.com/questions/33394428/javafx-version-of-executorservice। – MSB

संबंधित मुद्दे