2008-12-10 12 views
5

मैं ग्रहण प्लगइन्स लिख रहा हूं, और अक्सर ऐसी परिस्थिति होती है जहां एक चल रहे नौकरी को थोड़ी देर के लिए रुकने की आवश्यकता होती है, यूआई थ्रेड पर असीमित रूप से कुछ चलाएं, और फिर से शुरू करें।ग्रहण में asyncExec से वापसी मूल्य प्राप्त करने का सबसे अच्छा तरीका क्या है?

Display display = Display.getDefault(); 
display.syncExec(new Runnable() { 
    public void run() { 
       // Do some calculation 
       // How do I return a value from here? 
    } 
}); 
// I want to be able to use the calculation result here! 

एक तरह से यह पूरी नौकरी वर्ग कुछ क्षेत्र है है क्या करने के लिए:

तो मेरी कोड आमतौर पर तरह दिखता है। दूसरा एक अनुकूलित वर्ग का उपयोग करना है (इसके लिए अज्ञात है और इसके परिणामी डेटा फ़ील्ड का उपयोग करें, आदि सबसे अच्छा और सबसे सुरुचिपूर्ण दृष्टिकोण क्या है?

+0

आपको "यूआई थ्रेड पर कुछ अतुल्यकालिक रूप से चलाने" के कथन को स्पष्ट करने की आवश्यकता है क्योंकि आपका नमूना कोड स्पष्ट रूप से display.syncExec का उपयोग करता है, जिसका अर्थ है कि आपका जॉब थ्रेड रोक देगा जबकि कोड को चलाने() को डिस्प्ले थ्रेड पर निष्पादित किया जाएगा। – SCdF

+0

शीर्षक और प्रश्न पाठ 'asyncExec' कहता है, लेकिन उदाहरण कोड में' syncExec' है। वह दो बहुत ही अलग समस्याएं! इनमें से कौनसा? – Lii

उत्तर

4

आपको शायद यह नहीं मानना ​​चाहिए कि asyncExec कॉल रिटर्न के समय async Runnable समाप्त हो जाएगा।

इस मामले में, आप परिणामस्वरूप श्रोताओं/कॉलबैक (संभावित रूप से कमांड पैटर्न) में परिणाम को धक्का दे रहे हैं, या यदि आप परिणाम को बाद में उसी विधि में उपलब्ध करना चाहते हैं, तो java.util.concurrent.Future जैसे कुछ का उपयोग करना ।

0

अच्छा, अगर यह सिंक हो तो आप किसी प्रकार का मूल्य धारक रख सकते हैं । run() विधि के लिए बाहरी

क्लासिक है:

final Container container = new Container(); 
Display display = Display.getDefault(); 
display.syncExec(new Runnable() 
{ 
    public void run() 
    { 
    container.setValue("foo"); 
    } 
} 
System.out.println(container.getValue()); 

कंटेनर कहाँ बस है:

public class Container { 
    private Object value; 
    public Object getValue() { 
    return value; 
    } 
    public void setValue(Object o) { 
    value = o; 
    } 
} 

यह निश्चित रूप से उल्लसित और डोडी है (यहां तक ​​कि अधिक डोडी एक नई सूची बना रहा है और फिर पहला तत्व स्थापित कर रहा है) लेकिन syncExec विधि ब्लॉक इसलिए इतना बुरा नहीं आता है।

छोड़कर जब कोई बाद में वापस आता है और यह asyncExec() है ..

+0

यह प्रश्न के लिए काम नहीं करता है, जो asyncExec() – jamesh

+0

है प्रश्न में उदाहरण कोड syncExec() का उपयोग कर रहा है और प्रश्न पाठ कहता है "चल रहे नौकरी को थोड़ी देर के लिए रोकना आवश्यक है, यूआई थ्रेड पर कुछ अतुल्यकालिक रूप से चलाएं , और फिर से शुरू करें "। तो मुझे लगता है कि यह काम करता है। –

7

मुझे लगता है कि कंटेनर के ऊपर "सही" विकल्प है। इसे टाइप सुरक्षा के लिए भी जेनेरिक किया जा सकता है। इस तरह की स्थिति में त्वरित पसंद अंतिम सरणी मुहावरे है। चाल यह है कि रननेबल से संदर्भित किसी भी स्थानीय चर को अंतिम होना चाहिए, और इस प्रकार संशोधित नहीं किया जा सकता है। तो बजाय, आप एक ही तत्व सरणी, जहां सरणी अंतिम है उपयोग करें, लेकिन सरणी के तत्व संशोधित किया जा सकता:

final Object[] result = new Object[1]; 
Display display = Display.getDefault(); 
display.syncExec(new Runnable() 
{ 
    public void run() 
    { 
    result[0] = "foo"; 
    } 
} 
System.out.println(result[0]); 

फिर, यह उन मामलों आप जहां के लिए "जल्दी" समाधान है एक अज्ञात वर्ग और आप इसे एक विशिष्ट कंटेनर कक्षा को परिभाषित किए बिना परिणाम छूने के लिए एक जगह देना चाहते हैं।

अद्यतन के बाद मैं इस एक सा के बारे में सोचा, मुझे एहसास हुआ यह श्रोता और आगंतुक प्रकार के उपयोग के लिए ठीक काम करता है जहां कॉलबैक एक ही धागे में है। इस मामले में, हालांकि, रननेबल एक अलग थ्रेड में निष्पादित करता है, इसलिए आपको सिंकएक्सैक रिटर्न के बाद वास्तव में परिणाम देखने की गारंटी नहीं है।

AtomicReference के मूल्य के
final AtomicReference<Object> result = new AtomicReference<Object>(); 
Display display = Display.getDefault(); 
display.syncExec(new Runnable() 
{ 
    public void run() 
    { 
    result.set("foo"); 
    } 
} 
System.out.println(result.get()); 

परिवर्तन की गारंटी है, सभी धागे से दिखाई दे सकता है बस के रूप में अगर यह अस्थिर घोषित किया गया: सही समाधान एक AtomicReference उपयोग करने के लिए है। यह विस्तार से वर्णित है here

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

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