2015-01-07 6 views
5

क्या जावा एक समय में एक से अधिक ईडीटी बनाने में सक्षम है?क्या दो या दो से अधिक ईवेंट प्रेषण धागा (ईडीटी) स्थापित करने का कोई तरीका है?

मैं ईडीटी स्थापित करने के साथ प्रयोग कर रहा हूं और यह "भारी कर्तव्य" पैनल की सामग्री को अद्यतन करने में कैसे काम करता है जिसमें संभावित रूप से एक दर्जन पैनलों को सैकड़ों घटकों के साथ एम्बेडेड किया जाता है। वर्तमान में मैं

 public void run() { 
      SwingUtilities.invokeLater(new Runnable() { 
       public void run() { 
        panel.update(); 
       } 
      }); 
     } 

मैं निम्नलिखित पदों को देखा है:

Measuring "busyness" of the event dispatching thread

How does the event dispatch thread work?

Java Event-Dispatching Thread explanation

http://en.wiki2.org/wiki/Event_dispatching_thread

और इसके आगे ।

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

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

"This is necessary because most Swing object methods are not "thread safe": invoking them from multiple threads risks thread interference or memory consistency errors." 

तो के अनुसार क्या हुआ अगर मैं

विल जावा?

नीचे (नए Runnable() {...} .start() नया थ्रेड के साथ एक 2 EDT बनाने अपने आप मर्ज

वापस एक करने के लिए दो EDTs धागा सुरक्षा के डर से?

 new Thread(new Runnable() { 
     public void run() { 
      SwingUtilities.invokeLater(new Runnable() { 
       public void run() { 
        panel.update(); 
       } 
      }); 
     } 
    }).start(); 
+3

आपका दूसरा धागा ईडीटी नहीं है, बस टी।;) –

+2

मुझे नहीं लगता कि आप एक ईडीटी बना सकते हैं। स्विंग अपने स्वयं के ईडीटी बनाता है। आप जितना चाहें उतने धागे बना सकते हैं (कुछ बड़ी सीमा तक), लेकिन वे ईडीटी नहीं होंगे। आपका उदाहरण कोड 'रननेबल' ऑब्जेक्ट बनाता है, लेकिन यह आपके थ्रेड में 'panel.update' नहीं चलाएगा। इसके बजाए, यह ऑब्जेक्ट स्विंग को दिया गया है, जो इसे कहीं से बचाता है, और फिर अंत में ईडीटी इसे पाता है और इसे चलाता है। – ajb

+0

[एकाधिक इवेंट डिस्पैच थ्रेड] के संभावित डुप्लिकेट (http: // stackoverflow।कॉम/प्रश्न/7323306/एकाधिक-घटना-प्रेषण-धागे) – Jayan

उत्तर

2

वहाँ केवल हो सकता है एक घटना डिस्पैच थ्रेड!

+०१२३५१६४१०६१

लेकिन आप इसके लिए एक से अधिक धागे क्यों लेना चाहते हैं? यहां तक ​​कि कई घटकों के साथ "भारी कर्तव्य" पैनलों के लिए भी (आवेदन में मैं वर्तमान में काम कर रहा हूं वहां घटकों के 1000s होना चाहिए) एक ईडीटी पर्याप्त है। याद रखें कि आपको EDT पर कोई भी कार्य नहीं करना चाहिए जो बहुत सी CPU समय का उपयोग करता है। अन्यथा आप अद्यतन घटनाओं के लिए ईडीटी को अवरुद्ध करेंगे और उपयोगकर्ता इनपुट के जवाब में आपका जीयूआई "आलसी" बन जाएगा।

यह भी याद रखें कि सभी जीयूआई घटकों को केवल ईडीटी के भीतर से बनाया और छेड़छाड़ की जानी चाहिए क्योंकि कई घटक थ्रेड सेव नहीं हैं। इस दिशानिर्देश को अनदेखा करना विशिष्ट कार्यों के लिए काम कर सकता है लेकिन जल्द या बाद में आपको अजीब व्यवहार और/या दुर्घटनाएं मिलेंगी!

+1

कंप्यूटेशंस हैं जो मैंने एक कक्षा के भीतर किया है जो पैनल और घटकों को बनाने के लिए भी जिम्मेदार है। इसलिए मुझे लगता है कि जीयूआई से कोर क्लास को विभिन्न वर्ग – mk7

+0

में अलग करने के लिए यह एक अच्छा अभ्यास है! आम तौर पर आप [मॉडल-व्यू-कंट्रोलर] (http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93 कंट्रोलर) पैटर्न पर एक नज़र रखना चाहते हैं। हमेशा याद रखना सुनिश्चित करें कि ईडीटी पर जीयूआई घटकों का निर्माण और हेरफेर निष्पादित किया गया है। ज्यादातर बार यह स्वचालित रूप से मामला होता है जब आप कोड को उदा। एक एक्शनलिस्टर (जो ईडीटी पर चलाया जाता है) लेकिन कभी-कभी आप जीयूआई तत्वों को एक अलग थ्रेड के रूप में एक्सेस करना चाहते हैं, तो आपको स्विंगउटिविटीज.वोकलाटर या स्विंगउटीलिटीज.वोक एंड एंडैट का उपयोग करना होगा। –

1

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

एक और ईडीटी जोड़ना प्रदर्शन में अज्ञात मात्रा में वृद्धि (या कमी) के लिए अधिक जटिलता पेश करेगा।

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