2012-01-24 27 views
7

यह छोटा हो सकता है, मैं SwingWorker पर एक साधारण दस्तावेज़ीकरण को समझने के लिए संघर्ष कर रहा हूं।जावा स्विंगवर्कर.डोइनबैकग्राउंड() को जीयूआई तत्वों का उपयोग नहीं करना चाहिए

यहाँ है प्रतिलिपि चिपकाया सामग्री

कार्यप्रवाह

वहाँ तीन धागे एक SwingWorker के जीवन चक्र में शामिल हैं:

वर्तमान धागा: निष्पादित() विधि इस पर कहा जाता है धागा। यह कार्यकर्ता थ्रेड पर निष्पादन के लिए स्विंगवर्कर शेड्यूल करता है और तुरंत देता है। विधियों को प्राप्त करने के लिए स्विंगवर्कर को पूरा करने के लिए कोई इंतजार कर सकता है।

कार्यकर्ता धागा: इस धागे पर doInBackground() विधि को कॉल किया जाता है। यह वह जगह है जहां सभी पृष्ठभूमि गतिविधियां होनी चाहिए। को सूचित करने के लिए प्रॉपर्टी चेंजलिस्ट्स बाध्य गुणों के बारे में फ़ायरप्रॉपर्टी चेंज और getPropertyChangeSupport() विधियों का उपयोग करें। डिफ़ॉल्ट रूप से दो बाध्य गुण उपलब्ध हैं: राज्य और प्रगति।

इवेंट डिस्पैच थ्रेड: सभी स्विंग संबंधित गतिविधियां इस धागे पर होती हैं। स्विंगवर्कर प्रक्रिया को आमंत्रित करता है और() विधियों और इस धागे पर किसी भी PropertyChangeListeners को सूचित करता है।

अक्सर, वर्तमान धागा इवेंट डिस्पैच थ्रेड है।

-

कार्यकर्ता धागा EDT,() doInBackground में इसलिए कोड जीयूआई तत्वों का उपयोग नहीं करना चाहिए नहीं है। क्या मेरी समझ सही है?

पृष्ठभूमि: हमारे पास स्विंगवर्कर का उपयोग करने वाला छोटा कोड है लेकिन इसमें फ़ाइलकहोसर बनाने और setCurrentDirectory() पर कॉल करने में डिनबैकग्राउंड() है। मुझे संदेह है कि मुझे http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6637181 (11-बंद, कोई दोष नहीं) के रूप में लगभग अपवाद का नेतृत्व कर रहा है

उत्तर

11

हां। पृष्ठभूमि धागे से - नियमित थ्रेड और SwingWorker.doInBackground दोनों आपको विभिन्न परेशानी से बचने के लिए UI को संशोधित नहीं करना चाहिए।

इसके बजाय, एक Runnable में परिवर्तन लपेट और उन्हें SwingUtilities.invokeAndWait, SwingUtilities.invokeLater या के माध्यम से EDT में मार डाला गया है - जब SwingWorker का उपयोग कर - (doInBackground से) publish के माध्यम से। processSwingWorker की विधि के भीतर, जिसे ईडीटी द्वारा निष्पादित किया गया है, आप जीयूआई तक पहुंच सकते हैं।

http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html

व्यक्तिगत रूप से, मैं invokeLater और invokeAndWait को खोजने के लिए आसान कई स्थितियों के लिए उपयोग करने के लिए। स्विंगवर्कर ठीक है उदा। प्रगति सलाखों।

+0

धन्यवाद- हम जो कुछ भी आपने लगभग सभी स्थानों के उत्तर में लिखा है वह हम करते हैं। वहां कुछ ऐसे क्षेत्र हैं जहां कोड स्विंगवर्कर का उपयोग करता है। यहां तक ​​कि उन मामलों में, प्रसंस्करण को जीयूआई एक्सेसिंग और गैर-गुई भाग में विभाजित किया जा सकता है। – Jayan

+0

विभाजित दाएं करने से आमतौर पर प्रदर्शन में वृद्धि होगी और समस्याओं से बचेंगी, इसलिए इसकी दृढ़ता से अनुशंसा की जाती है। –

+0

@Jayan ट्यूटोरियल प्रकाशित/प्रक्रिया/किए गए आउटपुट से आउटपुट के बारे में बात करते हुए, आप परीक्षण कर सकते हैं कि अगर (isEventDispatchThread) कृपया पढ़ें http://stackoverflow.com/questions/7053865/cant-get-arrayindexoutofboundsexception-from- भविष्य-and-swingworker- अगर-थ्रेआ। +1 – mKorbel

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

  • कोई संबंधित समस्या नहीं^_^