क्या हो सकती है स्विंग वर्कर थ्रेड की संख्या पर ऊपरी सीमा है जिसे चलाया जा सकता है या यह स्मृति की सहायता के समान है? यह कॉन्फ़िगर करने योग्य कहीं भी है?स्विंग वर्कर थ्रेड की अधिकतम संख्या
उत्तर
ए SwingWorker
एक धागा नहीं है बल्कि एक कार्य है जो थ्रेड में निष्पादित किया जाएगा। आमतौर पर, SwingWorker
के उदाहरण निष्पादित करने के लिए आप ExecutorService
का उपयोग करेंगे; , अब
int n = 20; // Maximum number of threads
ExecutorService threadPool = Executors.newFixedThreadPool(n);
SwingWorker w; //don't forget to initialize
threadPool.submit(w);
यदि आप सबमिट एन की तुलना में अधिक SwingWorker
उदाहरणों, वे कतार और जब तक पूल से एक धागा उपलब्ध हो जाता है इंतज़ार करना होगा: इस इंटरफेस भी धागे की संख्या निर्धारित करने की अनुमति देता है।
तो आप सैद्धांतिक रूप से कह रहे हैं कि मैं स्विंग वर्कर कार्यों की किसी भी संख्या को चला सकता हूं बशर्ते मैं उनमें से प्रत्येक के लिए अलग-अलग धागे चलाएं। –
सिद्धांत रूप में हां; निश्चित रूप से कंप्यूटिंग पावर एक मुद्दा होगा। – mort
उम .... क्या? तुम यह क्यों करोगे? स्विंगवर्कर का अपना पूल है जो 10 आकार के लिए डिफ़ॉल्ट है, और जब आप 'स्विंगवर्कर # निष्पादन()' का आह्वान करते हैं तो यह कार्य को शेड्यूल करता है। 'इस स्विंगवर्कर को वर्कर थ्रेड पर निष्पादन के लिए शेड्यूल करता है। कई कार्यकर्ता धागे उपलब्ध हैं। ': Https://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html#execute() ... ऐसा करने से आप पुनः आविष्कार कर रहे हैं पहिया। 'स्विंगवर्कर' एक उपयोगिता थी जिसे आपको ऐसा नहीं करना पड़ेगा। ऐसा करने का एकमात्र कारण यह है कि यदि 10 का डिफ़ॉल्ट पूल आकार बहुत छोटा था, और उस बिंदु पर आप कच्चे 'रननेबल' – searchengine27
final int corePoolSize = 100;
final int maximumPoolSize = 100;
final long keepAliveTime = 100000;
final TimeUnit unit = TimeUnit.SECONDS;
final BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(maximumPoolSize);
sun.awt.AppContext.getAppContext().put(SwingWorker.class,
new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue));
उपर्युक्त कोड नमूना आपको स्विंगवर्क्सर्स की डिफ़ॉल्ट संख्या से अधिक निष्पादित करने की अनुमति देगा। बेशक यह कुछ पिछवाड़े sun.awt.AppContext क्लास तक पहुंच रहा है, लेकिन यह रुचि रखने वालों के लिए एक त्वरित कामकाज है, और अपने स्वयं के निष्पादक सेवा प्रदान करने में सक्षम/तैयार नहीं है।
मुझे लगता है कि स्विंगवर्कर्स के साथ एक भ्रमित बिंदु यह है कि SwingWorker.execute() विधि श्रमिकों को एक डिफ़ॉल्ट/निजी थ्रेड पूल पर चलाती है, जो कुछ कम संख्या में धागे के लिए तय होती है। यह छोटे/सरल ऐप्स के लिए पर्याप्त और उचित है। हालांकि, समेकन पर अधिक नियंत्रण पाने के लिए दो अवलोकन करें: 1. स्विंगवर्कर्स रननेबल फ्यूचर्स 2. स्विंगवर्कर्स को स्विंगवर्कर.एक्सक्यूट() विधि को कॉल करके चलाने की ज़रूरत नहीं है। तो, बस अपनी जरूरतों के लिए कॉन्फ़िगर किया गया अपना खुद का थ्रेड पूल (एक्जिक्यूटोर सर्विस) बनाएं, और उसके बाद सबमिट करें() या निष्पादित करें() स्विंगवर्कर्स। –