2008-11-11 7 views
6

जो मैं पढ़ सकता हूं, उसके लिए कुछ "पृष्ठभूमि" काम करने के लिए स्विंग ऐप में एक नया धागा प्रेषित करने के लिए उपयोग किया जाता है, लेकिन "सामान्य" थ्रेड के बजाय इसका उपयोग करने से क्या फायदा होता है?स्विंगवर्कर का तर्क क्या है?

एक नया थ्रेड का उपयोग कर और जब इसे का उपयोग SwingUtilities.invokeLater? कुछ जीयूआई विधि आह्वान खत्म ... एक ही नहीं है मैं यहाँ क्या याद आ रही है?

http://en.wikipedia.org/wiki/SwingWorker

http://java.sun.com/products/jfc/tsc/articles/threads/threads2.html

उत्तर

10

हां, आप यह पूरा कर सकते हैं कि स्विंगवर्कर वेनिला धागे + invokeLater के साथ क्या करता है। स्विंगवर्कर पृष्ठभूमि थ्रेड पर कार्यों को पूरा करने और ईडीटी पर रिपोर्ट परिणाम देने के लिए एक अनुमानित, एकीकृत तरीका प्रदान करता है। स्विंगवर्कर अतिरिक्त रूप से मध्यवर्ती परिणामों के लिए समर्थन जोड़ता है। दोबारा, आप यह सब स्वयं कर सकते हैं लेकिन कभी-कभी एकीकृत और अनुमानित समाधान का उपयोग करना आसान होता है, खासकर जब यह समेकन की बात आती है।

+0

* खांसी * "एकीकृत" रास्ता * खांसी * – Rob

+2

@ रोब ने अंततः टाइपो को ठीक किया। केवल 3 साल – basszero

2

SwingWorker एक आम पैटर्न के एक कार्यान्वयन है (नेट में मैं पढ़ा इसके लिए है GuiWorker BackgroundWorker), तो आपको एक जीयूआई कार्यक्रम में कुछ काम करना है जहां, लेकिन जीयूआई उत्तरदायी रखें। समस्या यह है कि अक्सर जीयूआई पुस्तकालय बहु थ्रेड सुरक्षित नहीं होते हैं, इसलिए ऐसे श्रमिकों को लागू करने का सामान्य तरीका एप्लिकेशन के ईवेंट लूप में संदेशों को स्थानांतरित करने के लिए लाइब्रेरी के संदेश लूप का उपयोग करना है।

ये कक्षाएं आपको आसानी से अपने जीयूआई अपडेट करने की अनुमति देती हैं। आम तौर पर, उनके पास update(int status) विधि है जिसे थ्रेड द्वारा बुलाया जाता है, कक्षा द्वारा भेजा जाता है, और जीयूआई द्वारा संभाला जाता है, जबकि धागा अपना काम जारी रखता है।

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

+0

आपको स्विंगवर्कर के साथ श्रोता की भी आवश्यकता है। इसलिए? – OscarRyz

+0

मेरा मतलब यह था कि आपको अपने स्वयं के आयोजन प्रबंधन के लिए अपने श्रोताओं (पहले से बनाए गए श्रोता इंटरफेस नहीं) की आवश्यकता होगी। स्विंगवर्कर यह सब आपके लिए संभालता है। उदाहरण के लिए आप "पूर्ण" विधि को ओवरराइट कर सकते हैं, जिसे कार्यकर्ता समाप्त होने पर कहा जाता है। –

+0

या आप आसानी से –

1

अपने प्रश्न का उत्तर देने के लिए, आपको कुछ भी याद नहीं है। यह वर्ग आपके द्वारा लिखी गई कार्यक्षमता को लपेटने के लिए केवल एक सुविधाजनक उपयोगिता है (पृष्ठभूमि कार्य करने के लिए एक और धागा शुरू करें और फिर परिणामों के साथ ईडीटी पर कुछ अंतिम कार्रवाई का आह्वान करें)।

3

एक कोड उदाहरण:

import org.jdesktop.swingx.util.SwingWorker; // This one is from swingx 
              // another one is built in 
              // since JDK 1.6 AFAIK? 

public class SwingWorkerTest { 

    public static void main(String[] args) { 

    /** 
     * First method 
     */ 
    new Thread() { 

     public void run() { 

     /** Do work that would freeze GUI here */ 

     final Object result = new Object(); 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      public void run() { 
      /** Update GUI here */ 
      } 
     }); 

     } 
    }.start(); 

    /** 
     * Second method 
     */ 
    new SwingWorker< Object , Object >() { 

     protected Object doInBackground() throws Exception { 
     /** Do work that would freeze GUI here */ 

     return null; 
     } 

     protected void done() { 
     try { 
      Object result = get(); 
      /** Update GUI here */ 
     } 
     catch (Exception ex) { 
      ex.printStackTrace(); 
      if (ex instanceof java.lang.InterruptedException) 
      return; 
     } 
     } 
    }.execute(); 
    } 

} 

विकल्प हमेशा व्यक्तिगत पसंद और उपयोग के मामले पर निर्भर करता है।

रीफैक्टरिंग करते समय दूसरी विधि का लाभ होता है। जब आप जिस विधि में उपयोग करते हैं, वह बहुत बड़ी है, तो आप अज्ञात वर्ग को एक आंतरिक कक्षा में आसानी से परिवर्तित कर सकते हैं।

मेरे निजी पसंद दूसरी को जाता है, हम एक रूपरेखा जहां SwingWorkers जोड़ा जा सकता है और एक के बाद एक क्रियान्वित कर रहे हैं ...

0

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

0

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

1

स्विंग के साथ काम करते समय, यह जानना महत्वपूर्ण है कि मुख्य स्विंग प्रसंस्करण (यानी प्रतिपादन) एक धागे पर होता है (जो आपका मुख्य धागा नहीं है)। इसे अक्सर स्विंग या अल्ट इवेंट थ्रेड कहा जाता है। जेडीके प्री 1.6 से परिचित लोगों को "ग्रे आयताकार" बग याद होगा यदि आपने एक स्विंग घटक के लिए एक ईवेंट प्रेषक में बहुत अधिक समय बिताया है। इसका क्या मतलब है। किसी भी स्विंग एप्लिकेशन में आपके पास 2 थ्रेड चलेंगे जो आपको अब सौदा करना होगा। आम तौर पर यदि आपके सभी ऑपरेशन किसी इवेंट डिस्पैचर के भीतर होते हैं (कोड जो निकाला जाता है, तब कहता है कि बटन दबाया जाता है) छोटा होता है (यानी एक सिनग बटन की स्थिति बदलना) आप इसे इवेंट डिस्पैचर के अंदर ही चला सकते हैं। यदि आपका एप्लिकेशन किसी वेब सेवा या डेटाबेस को कॉल करने जा रहा है, या आप आवेदन स्थिति बाहरी घटनाओं (यानी जेएमएस) द्वारा संचालित होती है या आप केवल अपने यूआई को अधिक इंटरैक्टिव बनाना चाहते हैं (यानी वस्तुओं की सूची बनाएं और सक्षम हो जाएं कुछ और करें) आपको अल्ट इवेंट थ्रेड (मुख्य स्विंग एक) के अलावा किसी थ्रेड का उपयोग करना चाहिए। तो इन मामलों में आप एक नया धागा पैदा करते हैं और जो करते हैं वह करते हैं, और जब परिणाम आखिरकार वापस आते हैं, तो आपको किसी भी तरह एक ऐसी घटना बनाना पड़ता है जिसे awt/स्विंग प्रेषक द्वारा निष्पादित किया जा सकता है। स्विंगवर्कर एक बहुत छोटा डिज़ाइन पैटर्न है जो आपको ऐसा करने की अनुमति देता है (दूसरा तरीका स्विंग यूटिलिटीज है)। यह बाहरी स्रोतों से डेटा लाने के लिए विशेष रूप से उपयोगी है या लंबी गणना कहता है (एक ग्राफिक्स दृश्य प्रस्तुत करना)। यह प्रेषण को स्वचालित करने में मदद करता है और परिणामों के बाद के बाहरी धागे (अल्ट थ्रेड के अलावा) के पुन: एकीकरण में मदद करता है। एसिंक घटनाओं के लिए (यानी जेएमएस से एक कार्यक्रम को परिणाम अपडेट करने की आवश्यकता है, स्विंग यूटिलिटीज का उपयोग करें)।