2010-05-13 6 views
9

SwingWorker निम्नलिखित प्रयोजनों के लिए प्रयोग किया जाता है के बीच अंतर:जावा - SwingWorker और SwingUtilities.invokeLater()

  • एक अलग सूत्र में लंबे समय से चल चल रहे कार्यों के लिए इतनी के रूप में किया जा रहा से अनुत्तरदायी जीयूआई को रोकने के लिए
  • done() विधि के माध्यम से कार्य के अंत में लंबे समय तक चलने वाले कार्य द्वारा उत्पादित परिणामों के साथ जीयूआई अपडेट करने के लिए।
  • publish() और process() विधियों की सहायता से कार्य द्वारा उत्पादित और प्रकाशित इंटरमीडिएट परिणामों के साथ समय-समय पर जीयूआई अपडेट करने के लिए।

SwingUtilities.invokeLater() ऊपर कार्य इस प्रकार कर सकते हैं:

  • इसके बजाय EDT से SwingWorker.execute() विधि को क्रियान्वित करने के लिए, हम ExecutorService.submit(new MyRunnable()) निष्पादित कर सकते हैं के रूप में यह भी एक और धागा जो लंबे समय से चल कार्य निष्पादित कर सकते हैं पैदा करेगा।
  • कार्य के अंत में जीयूआई अपडेट करने के लिए, हम कार्य के अंत में कोड डाल सकते हैं (done() मामले 1 के मामले में 0) SwingUtilites.invokeLater(new RunnableToExecuteDoneMethodCode())
  • कार्य के मध्य में जीयूआई अपडेट करने के लिए, हम कोड 1 (process() मामले 1 में विधि 0) SwingUtilites.invokeLater(new RunnableToExecuteProcessMethodCode()) पर लिखा जा सकता है जहां हमने publish() विधि 1 में विधि कहा था।

मैं इस सवाल क्योंकि समस्या सवाल Java - SwingWorker - Can we call one SwingWorker from other SwingWorker instead of EDT में निर्दिष्ट SwingUtilities.invokeLater() द्वारा हल किया जा सकता है, लेकिन SwingWorker

+1

मैं काफी यकीन है कि क्या 'सवाल' है नहीं कर रहा हूँ। – akf

+0

@akf अगर आप निश्चित नहीं हैं, तो इसे छोड़ दें। सरल :) –

+0

आप जिस समस्या का उल्लेख करते हैं वह स्विंगवर्कर का उपयोग कर हल करने योग्य है। मेरा जवाब वहां देखें। –

उत्तर

6

SwingWorker के साथ हल नहीं किया जा सकता पूछ रहा हूँ एक सहायक वर्ग है - यह नहीं है कि आप इसका उपयोग करने की आवश्यकता है, लेकिन इसका उपयोग हाथ से एक ही काम करने से कहीं अधिक सरल और स्पष्ट है। (यह प्रगति की जांच को आसान बनाता है।) ध्यान दें कि इसे संस्करण 6 जोड़ा गया था - इससे पहले कुछ लोगों ने स्विंग ट्यूटोरियल में परिभाषित एक सरल वर्ग का उपयोग किया था या आपके द्वारा नोट किए गए चरणों के समान कदम उठाया था।

+0

+1 सुविधाजनक रूप से, जावा 5 के लिए एक स्रोत संगत बैक-पोर्ट है। Https://swingworker.dev.java.net/ – trashgod

1

1.6+ स्विंगवर्कर वर्ग की एक महत्वपूर्ण विशेषता doInBackground() और done() के बीच ईडीटी (इवेंट डिस्पैच थ्रेड) अंतर है। आपको doWorkOutsideED() और doWorkInsideEDT() के रूप में doInBackground() के बारे में सोचना चाहिए। अलग देखने के लिए इस निर्देशक उदाहरण को चलाएं।

System.out.println("TID=" + Thread.currentThread().getId() + " (main)"); 
    final SwingWorker<String, String> x = new SwingWorker<String, String>() { 
     @Override 
     protected String doInBackground() throws Exception { 
      final long tid = Thread.currentThread().getId(); 
      System.out.println(""); 
      System.out.println("TID=" + tid + " doInBackground() isEventDispatchThread=" + SwingUtilities.isEventDispatchThread()); 
      System.out.println("Long running code goes here."); 
      return ""; 
     } 

     @Override 
     protected void done() { 
      final long tid = Thread.currentThread().getId(); 
      System.out.println(""); 
      System.out.println("TID=" + tid + "   done() isEventDispatchThread=" + SwingUtilities.isEventDispatchThread()); 
      System.out.println("GUI updates/changes go here."); 
     } 
    }; 
    x.execute(); 
    x.get(); 

आउटपुट:

TID=1 (main) 

TID=9 doInBackground() isEventDispatchThread=false 
Long running code goes here. 

TID=16   done() isEventDispatchThread=true 
GUI updates/changes go here.