2012-03-20 14 views
6

मेरे पास एक बहुप्रचारित कार्यान्वयन है जहां मैं एक निष्पादक सेवा प्रदान करता हूं और कार्य निष्पादित करने के लिए सबमिट करता हूं, मैं जानना चाहता हूं कि सभी धागे सबमिट किए जाने पर मुख्य धागे और यूआई को अवरुद्ध किए बिना समाप्त हो गया है। मैंने ExecutorService.awaitTermination() की कोशिश की है लेकिन यह मुख्य धागा और यूआई को अवरुद्ध करता है। मैंने बहुत कुछ खोजा है लेकिन मुझे ऐसा करने का एक शानदार तरीका नहीं दिख रहा है। मैं वर्तमान में एक और थ्रेड बनाने के बारे में सोच रहा हूं जो थ्रेड की मात्रा को पूरा करता है और जब वे सब खत्म हो जाते हैं तो एक ईवेंट लॉन्च करता है, लेकिन यह एक अच्छा दृष्टिकोण नहीं है और मैं एक बेहतर समाधान चाहता था!निष्पादक सेवा, कैसे पता चलेगा कि सभी धागे मुख्य धागे को अवरुद्ध किए बिना समाप्त हुए?

+0

आपका मुख्य कर कि यह अवरुद्ध नहीं किया जा सकता धागा क्या है पर एक नज़र? – EJP

+0

आप किस यूआई टूलकिट का उपयोग कर रहे हैं? – Dev

उत्तर

2

isTerminated() तथापि

टिप्पणी करना होगा कि awaitTermination और isTerminated दोनों ही आप एक सार्थक परिणाम के बाद आप shutdown

+0

मुझे कुछ चीजों के बारे में कुछ पता चला है() लेकिन फिर भी, मुझे लगता है कि मुझे इसे "साइड थ्रेड" पर चलाने की ज़रूरत है ताकि यह लगातार जांच सके कि यह सच है या नहीं, जो मुझे अपने शुरुआती समाधान में लाता है! – Trota

7

उपयोग एक SwingWorker बंद करने के लिए थ्रेड पूल कहा जाता है और awaitTermination() फोन है दे देंगे। यह यूआई को आपके स्विंगवर्कर कार्यान्वयन पर इवेंट डिस्पैच थ्रेड से done() को अवरुद्ध करने और कॉल करने से रोक देगा, जिसका उपयोग आप जो भी यूआई परिवर्तनों को ट्रिगर करने के लिए कर सकते हैं।

आप एक यूआई के माध्यम से चल रहा है धागे का ट्रैक रखने के लिए अद्यतन आप एक पाश में इस पर नजर रखने और तर्क जो तब EDT पर process() अपने क्रियान्वयन के लिए पारित करने के साथ publish() कॉल करने के लिए कार्यकर्ता धागा उपयोग कर सकते हैं की इच्छा है।

+1

उन्होंने कभी उल्लेख नहीं किया कि यह एक स्विंग एप्लिकेशन है, और यदि नहीं, तो एक स्विंगवर्कर उपयुक्त नहीं होगा। –

+1

मैं यह उल्लेख करना भूल गया कि यह एक स्विंग एप्लिकेशन है! – Trota

+0

स्विंगवर्कर पर और पढ़ने के बाद मुझे एहसास हुआ कि यह मेरी समस्या का एक काफी सरल समाधान है! धन्यवाद देव! – Trota

4

काउंटरडाउनलैच का उपयोग क्यों न करें और फिर लॉच पूरा होने पर मुख्य धागे को सूचित करें।

+1

अच्छा विचार; उद्धृत एक अच्छा उदाहरण है [यहां] (http://stackoverflow.com/a/3588523/230513)। – trashgod

+1

@trashgod ने अभी आपकी पोस्ट में टिप्पणी की है: उदाहरण के लिए EDC – kleopatra

2

आप जब निष्पादक सेवा उदाहरण बंद हो जाता है ट्रैक करने के लिए एक अलग थ्रेड बनाए रख सकते हैं:

final ExecutorService execSvc = ...; 
    execSvc.submit(task1); 
    ... 
    execSvc.submit(taskN); 
    // important to request the exec service to shut down :) 
    execSvc.shutdown(); 

    new Thread(new Runnable() { 

     public void run() { 
      while (!execSvc.isTerminated()) { 
       try { 
        execSvc.awaitTermination(60, TimeUnit.SECONDS); 
       } catch (InterruptedException e) { 
        // ignore exception 
       } 
      } 
      System.out.println("ExecSvc.run: exec service has terminated!"); 
      // possibly submit a task using SwingUtilities.invokeLater() to update the UI 
     } 

    }).start(); 
2

का उपयोग CountDownLatch

 

CountDownLatch latch = new CountDownLatch(totalNumberOfTasks); 
ExecutorService taskExecutor = Executors.newFixedThreadPool(4); 
while(...) { 
    taskExecutor.execute(new MyTask()); 
} 

try { 
    latch.await(); 
} catch (InterruptedException E) { 
    // handle 
} 

और अपने कार्य के भीतर

(/ अंत में कोशिश में लगा)
 latch.countDown(); 

या निष्पादक सेवा पर आप शट डाउन() और फिरwa itTermination()

 
ExecutorService taskExecutor = Executors.newFixedThreadPool(4); 
while(...) { 
    taskExecutor.execute(new MyTask()); 
} 
taskExecutor.shutdown(); 
try { 
    taskExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); 
} catch (InterruptedException e) { 
    ... 
} 

भी है THIS जवाब

+0

पर टेक्स्ट कॉम्पोनेंट तक पहुंचने में एक छोटी सी गड़बड़ है, जब तक कि मैं अपनी समझ में गलत नहीं हूं, इनमें से कोई भी समाधान ओपी के मौलिक प्रश्न को संबोधित नहीं कर रहा है जो मुख्य पर अवरुद्ध होने से बचने के लिए है धागा। – Trevor

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