2010-08-27 15 views
6

ऐसा लगता है कि जब मैं 12 स्विंग वर्कर थ्रेड को चालू करता हूं, तो पहला छः अपना कार्य पूरा करने लगता है, यह खत्म होता है और फिर अंतिम छः शुरू होता है और समाप्त होता है। जिस व्यवहार को मैं ढूंढ रहा हूं वह सभी 12 धागे एक ही समय में काम कर रहे हैं & एक ही समय में खत्म हो गया है।स्विंग वर्कर थ्रेड समवर्ती नहीं

मैं निम्नलिखित है:

for (int i = 0; i < 12; i++) 
{ 
     myTask m = new Mytask(i, START); 
     m.execute(); 
} 

myTask मीटर 0 से एक प्रगति बार भी वृद्धि होगी - 25 की वेतन वृद्धि मैं विदेशी व्यवहार है कि पहले छह धागे incrementing शुरू हो रही है में 100, वे कम से खत्म 100, तो अंतिम छः धागे 0 से शुरू होते हैं और वृद्धि करते हैं, और खत्म होते हैं।

क्या स्विंग वर्कर थ्रेड की मात्रा पर कोई सीमित कारक है?

उत्तर

6

जिस व्यवहार को मैं ढूंढ रहा हूं वह सभी 12 धागे एक ही समय में काम कर रहे हैं & एक ही समय में समाप्त हो जाते हैं।

CountDownLatch इस उद्देश्य के लिए डिज़ाइन किया गया है। यहां एक example एक SwingWorker और लोच द्वारा नियंत्रित कई सहायक धागे का उपयोग करके अच्छा है।

+0

दिन की मेरी सीखती वस्तु हैं :-) केवल उदाहरण के एक पहलू को पसंद नहीं करते हैं: कार्य टेक्स्ट को एक्सेस करते हैं कॉम्पोनेंट ईडीटी से (जो उस समय अभी भी थ्रेड-सुरक्षित होने के लिए प्रलेखित किया गया था ... जिसे हमेशा तर्क दिया गया था ...) संक्षेप में: बेहतर पर भरोसा न करें और एक invoke में लपेटें Later – kleopatra

+0

@ क्लोपेट्रा: अच्छी तरह से देखा गया! यह [उदाहरण] (http://stackoverflow.com/a/3245805/230513) की एक समान (गुप्त) समस्या थी; इसकी 'डिस्प्ले()' विधि आपके सुझाव को दिखाती है। – trashgod

+0

यह भी देखें, यह [उदाहरण] (http://stackoverflow.com/a/11372932/230513)। – trashgod

3

आपका प्रश्न का कहना है:

व्यवहार मैं तलाश कर रहा हूँ सभी 12 धागे एक ही समय एक ही समय में & खत्म पर काम शुरू है।

लेकिन आप सभी स्विंग कार्यकर्ताओं धागे समवर्ती शुरू करने और एक ही समय में समाप्त करने के लिए गारंटी नहीं दे सकते।

+0

क्यों नहीं? उसके पीछे तर्क क्या है? –

+0

क्योंकि वे थ्रेड हैं, और थ्रेड का निष्पादन एकाधिक facyors, cpu no।, ओएस, उपलब्ध संसाधन इत्यादि पर निर्भर करता है – YoK

+0

एक अलर्टिव के लिए मेरा उत्तर देखें। – trashgod

2

SwingWorker वर्ग MAX_WORKER_THREADS = के साथ एक स्थिर ExecutorService क्षेत्र 10. मैं कुछ तुम क्यों देखते हैं 6 और नहीं 10 नहीं कर रहा हूँ है लेकिन आप नहीं जा सकते 10

/** 
    * number of worker threads. 
    */ 
    private static final int MAX_WORKER_THREADS = 10; 

से अधिक

...

executorService = 
       new ThreadPoolExecutor(1, MAX_WORKER_THREADS, 
             10L, TimeUnit.MINUTES, 
             new LinkedBlockingQueue<Runnable>(), 
             threadFactory); 
+0

क्या मैं मैन्युअल रूप से # MAX_WORKER_THREADS को बदल सकता हूं या यह संभव नहीं है? 10 धागे की मनमानी संख्या होने का क्या कारण है? –

+0

नहीं, आप MAX_WORKER_THREADS में से # को नहीं बदल सकते हैं, क्योंकि यह अंतिम फ़ील्ड है। तर्क के लिए, आपको इगोर कुशनिर्स्की (कक्षा के लेखक) से पूछने की आवश्यकता है। –

+1

आप स्विंगवर्कर्स को निष्पादित करने के लिए अपने स्वयं के निष्पादक सेवा का उपयोग कर सकते हैं, क्योंकि वे फ्यूचर्स – keuleJ

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