2011-11-13 2 views
6

समाप्त करने के लिए प्रतीक्षा करें, मैं अपने स्विंगवर्कर के काम को पूरा करने के लिए इंतजार करना चाहता हूं, और फिर मैं एक और स्विंगवर्कर निष्पादित करना चाहता हूं। इस मामले में Encrypteer3 एक वर्ग है जो स्विंगवर्कर को बढ़ाता है।स्विंगवर्कर को

मेरे कोड:

input = txtTekst.getText(); 
    key = txtKey.getText(); 
    System.out.println("thread1 start"); 
    Encrypteer3 a = new Encrypteer3(); 
    a.execute(); 
    while(a.isDone()==false){ 
     // do nothing 
    } 
    input = output; 
    key = txtKey1.getText(); 
    System.out.println("thread2 start"); 
    Encrypteer3 b = new Encrypteer3(); 
    b.execute(); 
    while(b.isDone()==false){ 
     // do nothing 
    } 

यह मेरा जीयूआई फ्रीज बनाता है और (जब यह क्रियान्वित जावा CPU के लगभग 95% का उपयोग करता है) सीपीयू का एक बहुत उपयोग करता है। मुझे लगता है कि समस्या यह है कि यह लगातार जांच रहा है कि धागा किया जाता है और यही कारण है कि यह इतना सीपीयू गहन बनाता है।

स्विंगवर्कर वर्ग पर कोई भी शामिल() विधि नहीं है। मैं इस कम सीपीयू को गहन कैसे बना सकता हूं?

उत्तर

3

मुझे लगता है कि खाली पाश का उपयोग कर बुरा विचार है, SwingWorker

protected void done() 

जब यह, तो आप listerners और फायरिंग कार्रवाई है कि के लिए अगर आप बाहर निष्पादित करने के लिए चाहते हैं का उपयोग कर सकते समाप्त हो जहां निष्पादित कोड को परिभाषित कर सकते है एसडब्ल्यू

+2

से अपवाद (रों) प्राप्त करने के लिए समस्या यह है कि मैं स्थिति के आधार पर स्विंगवर्कर का एक अलग संख्या का उपयोग करता हूं। मैंने प्रॉपर्टी चेंजलिस्टर का इस्तेमाल किया और यह चाल है! उत्तर – user1026090

+1

@ user1026090 के लिए धन्यवाद: हाँ, एक संपत्तिChangeListener आपकी समस्या को हल करने का एक और शानदार तरीका है। 1+ आप और जावा, mkorbel और kowser के लिए। –

3

आपको SwingWorker से done विधि को ओवरराइड करने की आवश्यकता है।

SwingWorker#done()

के प्रलेखन doInBackground विधि के बाद घटना डिस्पैच थ्रेड पर निष्पादित से समाप्त हो गया है। डिफ़ॉल्ट कार्यान्वयन से कुछ भी नहीं होता है। इवेंट डिस्पैच थ्रेड पर पूर्ण कार्य करने के लिए सबक्लास इस विधि को ओवरराइड कर सकते हैं। ध्यान दें कि आप इस कार्य के परिणाम को निर्धारित करने के लिए इस विधि के कार्यान्वयन के अंदर स्थिति पूछ सकते हैं या यह कार्य रद्द कर दिया गया है या नहीं।

public class Encrypteer3 extends SwingWorker<Void, Void>{ 

    @Override 
    protected Void doInBackground() throws Exception { 
     // background task 
     return null; 
    } 

    @Override 
    protected void done() { 
     // will be executed when background execution is done 
    } 

} 

और उसके while(a.isDone()==false) { जो निष्पादित करने के लिए समय ले रहा है।

while(a.isDone()==false) { 
    // do nothing 
} 
0
I want to wait for my SwingWorker to finish working, and then I want 
to execute another SwingWorker. 

if(isDone) जाँच औजार Executor होगा की तुलना में बेहतर है, लेकिन सभी मामलों में (जिसका अर्थ है SwingWorker) आप इस thread जाँच करने के लिए है, कैसे नेस्टेड विधि (रों)