2010-11-23 14 views
13

मैं निम्नलिखित कोड है कहते हैं:मैं स्विंगवर्कर की doInBackground() विधि की प्रतीक्षा कैसे करूं?

import java.lang.InterruptedException; 
import javax.swing.SwingWorker; 

public class Test 
{ 
    private JDialog window; 

    public Test 
    { 
     // instantiate window 
    } 

    private class Task extends SwingWorker<Void, Void> 
    { 
     public Void doInBackground() 
     { 
      try { Thread.currentThread().sleep(5000); } 
      catch(InterruptedException e) {} 
      return null; 
     } 
    } 

    public void doTask() 
    { 
     Task task = new Task(); 
     task.execute(); 
    } 

    protected void process() 
    { 
     // update various GUI components here 
    } 

    public static void main(String args[]) 
    { 
     Test t = new Test(); 
     t.doTask(); 
     System.out.println("done"); 
    } 
} 

मैं t.doTask() तक इंतजार करने की जरूरत है बाहर मुद्रण 'पूर्ण' से पहले किया जाता है, लेकिन मैं वास्तव में कैसे यकीन नहीं है। मैं जानता हूँ कि मैं शायद join() यहाँ का उपयोग करना चाहिए, लेकिन मैं उस पर कॉल करने के लिए एक धागा जरूरत है, और मैं कैसे से जहाँ मैं join() कॉल करने की आवश्यकता doInBackground() की धागा प्राप्त करने के लिए पता नहीं है। किसी भी मदद के लिए धन्यवाद।


संपादित करें: प्रतिक्रियाओं के लिए धन्यवाद। दुर्भाग्यवश, get() और इस तरह की समस्या को हल नहीं करते हैं। मेरे वास्तविक कोड में, स्विंगवर्कर के पास ओवरराइड process() फ़ंक्शन है जो पृष्ठभूमि थ्रेड चल रहा है, जबकि एक GUI विंडो अद्यतन करता है। get()doInBackground के बाद तक मुद्रित किया जा रहा से 'पूर्ण' रोक है, लेकिन उसके बाद जीयूआई अपडेट नहीं होता। मैंने इसे प्रतिबिंबित करने के लिए अपना नमूना कोड अपडेट किया, हालांकि अब यह संकलित नहीं होगा।

वहाँ मुद्रित करने के लिए केवल एक बार doInBackground समाप्त हो गया है करने के लिए मिलता है 'पूर्ण' कोई तरीका है? क्या एक ही थ्रेड पर जीयूआई अपडेट कोड और 'किया गया' कथन है? क्या मुझे एक नया धागा बनाने की ज़रूरत है?

उत्तर

11

SwingWorker के बाद आमतौर पर कुछ भी करने की आवश्यकता है, इसके पृष्ठभूमि कार्य को done() विधि को ओवरराइड करके किया जाता है। इस विधि को स्विंग इवेंट थ्रेड पर पूरा होने के बाद बुलाया जाता है, जिससे आप जीयूआई अपडेट कर सकते हैं या कुछ प्रिंट कर सकते हैं या जो भी हो। यदि आपको वास्तव में पूरा होने तक ब्लॉक करने की आवश्यकता है, तो आप get() पर कॉल कर सकते हैं।

एनबी। done() विधि के भीतर get() कॉलिंग ताकि आप है कि किसी भी यूआई काम अवरुद्ध करने के बारे में चिंता करने की जरूरत नहीं है तुरंत अपने परिणाम के साथ वापस आ जाएगी।

+0

ठीक है, मैं यह 'का उपयोग किया काम कर मिल गया()'। आपकी सहायता के लिए धन्यवाद. – Max

+1

भावी googlers के लिए नोट: स्विंगवर्कर रद्द कर दिया गया है जब यह वास्तव में मदद नहीं करता है। 'किया गया()' 'InInBackground() 'पूरा होने से पहले चलाया जा सकता है। :-(http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6826514 http: // stackoverflow।कॉम/प्रश्न/6204141/स्विंगवर्कर-कब-बिल्कुल-कहा जाता है-विधि-विधि – kmort

9

कॉलिंग get()SwingWorker ब्लॉक करने के लिए कारण होगा।

Javadocs से

:

T get() 
     Waits if necessary for the computation to complete, 
     and then retrieves its result. 

आपका कोड तो लगेगा जैसे:

public static void main(String args[]) 
{ 
    Test t = new Test(); 
    t.doTask(); 
    t.get(); // Will block 
    System.out.println("done"); 
} 
0

सामान्य तौर पर, आप SwingWorker पर पकड़ चाहिए जब तक यह खत्म पर isDone() फोन करके जो आप परीक्षण कर सकते हैं, यह। अन्यथा बस get() पर कॉल करें जो इसे प्रतीक्षा करता है।

5

आप किए गए() विधि को ओवरराइड कर सकते हैं, जिसे doInBackground() पूरा होने पर कहा जाता है। ईडीटी पर किया गया() विधि कहा जाता है। तो कुछ इस तरह:

@Override 
protected void done() { 
    try { 
    super.get(); 

    System.out.println("done"); 
    //can call other gui update code here 
    } catch (Throwable t) { 
    //do something with the exception 
    } 
} 

किया अंदर विधि() कॉलिंग किसी भी अपवाद है कि doInBackground दौरान फेंक रहे थे वापस पाने में मदद करता है, तो मैं अत्यधिक यह सलाह देते हैं। स्विंगवर्कर पृष्ठभूमि थ्रेड को प्रबंधित करने के लिए आंतरिक रूप से कॉल करने योग्य और Future का उपयोग करता है, जिसे आप शामिल/उपज दृष्टिकोण की कोशिश करने के बजाय पढ़ना चाहते हैं।

+0

को कॉलिन डी के उत्तर पर यह टिप्पणी करनी चाहिए थी। – Jim

+0

कोई अपवाद प्राप्त करने के लिए get() का उपयोग करने के बारे में अच्छा बिंदु – HaveAGuess

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