2013-04-07 5 views
8

मैं छोटा ऐप लिख रहा हूं और अब मुझे एक समस्या मिली है। मुझे ऐप की खिड़की में लगी बिना एक (बाद में शायद दो) विधि (यह विधि कुछ लोड करती है और परिणाम देता है) को कॉल करने की आवश्यकता होती है।नए धागे में कॉल करने का आसान तरीका

मुझे Executor या Callable जैसी कक्षाएं मिलीं, लेकिन मुझे समझ में नहीं आता कि उन लोगों के साथ कैसे काम करना है।

क्या आप कोई समाधान पोस्ट कर सकते हैं, जो मेरी मदद करता है?

सभी सलाहओं के लिए धन्यवाद।

संपादित करें: विधि आवश्यक परिणाम लौटाएं। यह परिणाम पैरामीटर पर निर्भर करता है। कुछ इस तरह:

public static HtmlPage getPage(String page) throws FailingHttpStatusCodeException, MalformedURLException, IOException { 
     return webClient.getPage(page); 
} 

इस विधि के बारे में 8-10 सेकंड काम करता है। इस विधि को निष्पादित करने के बाद, थ्रेड को रोका जा सकता है। लेकिन मुझे हर 2 मिनट में विधियों को कॉल करने की ज़रूरत है।

संपादित करें: मैं इस के साथ कोड संपादित:

public static HtmlPage getPage(final String page) throws FailingHttpStatusCodeException, MalformedURLException, IOException { 
    Thread thread = new Thread() { 
     public void run() { 
      try { 
       loadedPage = webClient.getPage(page); 
      } catch (FailingHttpStatusCodeException | IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }; 
    thread.start(); 
    try { 
     return loadedPage; 
    } catch (Exception e) { 
     return null; 
    } 

} 

इस कोड को मैं फिर से त्रुटि मिल (भले ही मैं पकड़ ब्लॉक से बाहर return null डाल) के साथ।

+1

[ 'Executor'] (http://docs.oracle। कॉम/जावास/7/डॉक्स/एपीआई/जावा/यूज/समवर्ती/एक्जिक्यूटोर.html) और ['एक्जिक्यूटर्स सर्विस '] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent /ExecutorService.html) में javadoc में उदाहरण हैं। और [एक विषय] (http://docs.oracle.com/javase/tutorial/essential/concurrency/exinter.html) आधिकारिक ट्यूटोरियल में * concurrency * थ्रेड पर। यही वह जगह है जहां मैं शुरू करता हूं। यदि आप उन सामग्रियों में कुछ * विशिष्ट * नहीं समझते हैं, या यदि आप उनमें से जानकारी का उपयोग कर अटक गए हैं तो आपको एक नया प्रश्न पूछना चाहिए। – millimoose

+0

मैंने उदाहरणों को देखा, कड़वा मैं जो हासिल करना चाहता हूं उसे प्राप्त नहीं कर सकता। – Sk1X1

+1

मैं * सोचता हूं * आप जो खोज रहे हैं ['execorService.submit()'] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html#submit (java.util.concurrent.Callable)) 'कॉल करने योग्य ' के साथ, इसलिए उन और संबंधित कक्षाओं/विधियों के लिए प्रलेखन पर ध्यान केंद्रित करें। 'सबमिट()' को 'भविष्य ' वापस करना चाहिए जो परिणाम उपलब्ध होने पर आपको कुछ करने की अनुमति देगा (जैसे यूआई अपडेट करें)। – millimoose

उत्तर

22

सबसे पहले, मैं Java Thread Documentation को देखने की अनुशंसा करता हूं।

थ्रेड के साथ, आप Runnable नामक एक इंटरफ़ेस प्रकार में जा सकते हैं। दस्तावेज here पाया जा सकता है। एक रननेबल एक ऑब्जेक्ट है जिसमें run विधि है। जब आप धागा शुरू करते हैं, तो यह इस रननेबल ऑब्जेक्ट की run विधि में जो भी कोड है, उसे कॉल करेगा। उदाहरण के लिए:

Thread t = new Thread(new Runnable() { 
     @Override 
     public void run() { 
       // Insert some method call here. 
     } 
}); 

अब, जब आप t.start() कहते हैं, यह चलेंगे जो कुछ कोड आप मुख्य थ्रेड चल बिना करने के लिए इसकी जरूरत क्या इसका मतलब यह है। इसे Asynchronous विधि कॉल कहा जाता है, जिसका अर्थ यह है कि यह आपके main थ्रेड जैसे किसी अन्य थ्रेड के समानांतर में चलता है। :)

+0

मैं इस तरह कुछ करने की कोशिश करता हूं, लेकिन यह काम नहीं करता है (अगले उत्तर में अधिक जानकारी) – Sk1X1

+0

कॉलिंग विधि –

20

जावा 8 जब से तुम छोटे फार्म का उपयोग कर सकते हैं:

new Thread(() -> { 
    // Insert some method call here. 
}).start(); 

अद्यतन: इसके अलावा, आप विधि संदर्भ इस्तेमाल कर सकते हैं:

class Example { 

    public static void main(String[] args){ 
     new Thread(Example::someMethod).start(); 
    } 

    public static void someMethod(){ 
     // Insert some code here 
    } 

} 

आप जब इसका इस्तेमाल करने में सक्षम हैं अपने तर्क सूची आवश्यक है @FunctionalInterface, उदाहरण के लिए Runnable या Callable

और देखें: Platform.runLater and Task in JavaFX, Method References

1

जावा 8 में अगर कोई आवश्यक आप उपयोग कर सकते हैं पैरामीटर है:

new Thread(MyClass::doWork).start(); 

या मापदंडों के मामले में:

new Thread(() -> doWork(someParam)) 
+0

पर तर्क कैसे पास करें यह सापेक्ष है। पैरामीटर अभी छिपाए गए हैं और यह इंटरफ़ेस के इनपुट पैरामीटर पर निर्भर करता है। जब आप 'नया थ्रेड (MyClass :: doWork) लिखते हैं .start();' आप 'नया थ्रेड (() -> doWork()) भी लिख सकते हैं' रनबबल के लिए कोई इनपुट पैरामीटर नहीं है। लेकिन अगर आपको एक चर से इनपुट की आवश्यकता है कि यह बंद होने के बाहर है, हाँ से, आप दूसरा रास्ता कर सकते हैं। –

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