2011-09-25 4 views
11

मेरे कंप्यूटर में 4 कोर हैं और मैं जावा स्विंग गुई प्रोग्राम चला रहा हूं। जब मैं अपना आवेदन चलाता हूं तो यह केवल दो कोर और लगभग 30% CPU उपयोग का उपयोग करता है। मेरे पास प्रक्रिया करने के लिए बड़ी संख्या में फाइलें हैं और उन्हें अधिक सीपीयू का उपयोग करके इस कार्य को तेजी से करने के लिए उन्हें दो धागे में विभाजित करना है।स्विंगवर्कर उदाहरण एक साथ चल रहे नहीं हैं

class PrepareTask extends SwingWorker<Void, Void> { 
    int start, end; 
    PrepareTask (int start, int end) { ... } 
    ... 
    public Void doInBackground() {... } 
    public void done() { ... } 

मैं दो इस तरह के उदाहरण बना:

मैं एक SwingWorker वर्ग PrepareTask कहा जाता है, दो ints के साथ एक निर्माता है कि है

PrepareTask prepareTask = new PrepareTask(0,numberOfFiles/2); 
    prepareTask.execute(); 
    PrepareTask prepareTask2 = new PrepareTask(numberOfFiles/2, numberOfFiles); 
    prepareTask2.execute(); 

दोनों का शुभारंभ किया है (ऐसा लगता है), लेकिन जब यह चलता है तो मैं देख सकता हूं (प्रिंट स्टैम) कि पहले तैयार करने से पहले पहले तैयार करना (प्रिंट स्टैम्स अंदर) खत्म करना होगा। और सीपीयू उपयोग पहले जैसा ही है, लगभग 30%। वे दोनों एक ही स्रोत, एक डिफ़ॉल्टTableModel से डेटा लेते हैं।

यह कैसे करें या मैं क्या गलत कर रहा हूं इस पर कोई विचार? धन्यवाद।

+0

कृपया ध्यान दें कि यदि अधिकांश प्रोसेसिंग समय में फ़ाइल पहुंच शामिल है, तो कई धागे होने से यह तेज़ी से नहीं बढ़ेगा क्योंकि डिस्क आपकी बाधा बन जाएगी। क्या आप इन फ़ाइलों पर प्रसंस्करण की तरह आगे बढ़ सकते हैं? – jfpoilpret

उत्तर

16

यह एक जावा 6 अपडेट से दूसरे में स्विंगवर्कर व्यवहार में बदलाव का नतीजा है। वास्तव में जावा 6 के लिए पुराने सन बग डेटाबेस में इसके बारे में एक बग रिपोर्ट है।

क्या हुआ, एन ने एक थ्रेड कतार के साथ 1 थ्रेड का उपयोग करने के लिए एन थ्रेड का उपयोग करने से मूल स्विंगवर्कर कार्यान्वयन को बदल दिया। इसलिए आपके पास दो स्विंगवर्कर्स नहीं चल सकते हैं। (यह एक परिदृश्य भी बनाता है जहां डेडलॉक हो सकता है: यदि एक स्विंगवर्कर दूसरे के लिए इंतजार कर रहा है जो पहले इंतजार कर रहा है, तो एक कार्य परिणामस्वरूप डेडलॉक दर्ज कर सकता है।)

इसके आसपास पाने के लिए आप क्या कर सकते हैं एक निष्पादक सेवा का उपयोग करना है और उस पर फ्यूचरटास्क पोस्ट करें। ये 99% स्विंगवर्कर एपीआई प्रदान करेंगे (स्विंगवर्कर एक फ्यूचरटास्क व्युत्पन्न है), आपको बस इतना करना है कि आप अपने एक्जिक्यूटर को सही तरीके से स्थापित करें।

+1

मैंने इसे पहले बताया है, लेकिन आपने इसे सबसे अधिक बेहतर समझा है: +1 –

+0

और यह जावा एसई 6u21 में तय किया जाना चाहिए: http://www.oracle.com/technetwork/java/javase/bugfixes6u21- 156339.html – keuleJ

+0

यह बग है: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6925575 – keuleJ

0

शायद स्विंग आपके धागे की शेड्यूलिंग को नियंत्रित कर रही है? या हो सकता है कि स्विंगवर्कर के पास 1 का थ्रेड पूल आकार हो (स्विंगवर्कर जावाडोक में कई स्विंगवर्कर थ्रेड चलाने के बारे में कोई विवरण नहीं है और मुझे लगता है कि एकाधिक थ्रेड स्विंग में कुछ कठिन समरूपता समस्याओं का कारण बन सकते हैं)।

यदि सब आप क्या करना चाहते समानांतर में कुछ प्रसंस्करण चलाया जाता है, आप जावा Thread वर्ग का विस्तार, को लागू करने run, अंत में SwingUtilities.invokeLater() कॉल करने वाले किसी परिवर्तन के साथ जीयूआई अद्यतन करने के लिए द्वारा इस आसान तरीका का समाधान कर सकते हैं:

class PrepareTask extends Thread 
    { 
     PrepareTask (int start, int end) { ... } 
     public void run() { ... ; SwingUtilities.invokeLater(new Runnable() { public void run() { do any GUI updates here })} 
साथ धागे शुरू

: अपने डेटा मॉडल में

prepareTask.start(); 

या हो सकता है कुछ एकल thre है दूसरे धागे को संबोधित और अवरुद्ध करना? उस स्थिति में, आपको डेटा मॉडल के साथ उस समस्या को हल करना होगा।