मैं SwingWorker
का उपयोग करके कुछ विचारों को आजमा देना चाहता था क्योंकि मैंने इसे बहुत अधिक उपयोग नहीं किया है। इसके बजाए, मैं एक मुद्दे में भाग गया और मैं यह नहीं समझ सकता कि क्या गलत है।स्विंगवर्कर अप्रत्याशित रूप से क्यों रोकता है?
यहाँ एक छोटी SSCCE कि इस समस्या (मैं यहाँ SSCCEs की तरह लोगों को पता है) को दर्शाता है है:
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
public class SwingWorkerTest
{
public static void main (String[] args)
{
SwingUtilities.invokeLater (new Runnable()
{
@Override
public void run()
{
new MySwingWorker (500).execute();
new MySwingWorker (900).execute();
new MySwingWorker (1200).execute();
}
});
}
}
class MySwingWorker extends SwingWorker<Void, Void>
{
private int ms;
public MySwingWorker (int ms)
{
this.ms = ms;
}
@Override
protected Void doInBackground()
{
Thread t = Thread.currentThread();
for (int i = 0; i < 50; i++)
{
try
{
Thread.sleep (ms);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println ("I am thread with " + ms + " sleep in iteration " + i + ": " + t.getName() + " (" + t.getId() + ")");
}
return null;
}
}
तो मेरी कार्यक्रम 3 SwingWorkers कि स्क्रीन पर एक लाइन प्रिंट तो मिलीसेकेंड की निर्धारित संख्या के लिए सो बनाना चाहिए और फिर लाइन को दोबारा प्रिंट करें और फिर सोएं आदि। मैं SwingWorker
एस स्विंग के थ्रेड के भीतर से बना देता हूं क्योंकि अन्यथा वे भी शुरू नहीं करेंगे।
तो उम्मीद उत्पादन होता है:
I am thread with 500 sleep in iteration 0: SwingWorker-pool-1-thread-1 (15)
I am thread with 900 sleep in iteration 0: SwingWorker-pool-1-thread-2 (16)
I am thread with 500 sleep in iteration 1: SwingWorker-pool-1-thread-1 (15)
I am thread with 1200 sleep in iteration 0: SwingWorker-pool-1-thread-3 (17)
I am thread with 500 sleep in iteration 2: SwingWorker-pool-1-thread-1 (15)
I am thread with 900 sleep in iteration 1: SwingWorker-pool-1-thread-2 (16)
I am thread with 500 sleep in iteration 3: SwingWorker-pool-1-thread-1 (15)
I am thread with 1200 sleep in iteration 1: SwingWorker-pool-1-thread-3 (17)
I am thread with 500 sleep in iteration 4: SwingWorker-pool-1-thread-1 (15)
I am thread with 900 sleep in iteration 2: SwingWorker-pool-1-thread-2 (16)
I am thread with 500 sleep in iteration 5: SwingWorker-pool-1-thread-1 (15)
I am thread with 500 sleep in iteration 6: SwingWorker-pool-1-thread-1 (15)
I am thread with 900 sleep in iteration 3: SwingWorker-pool-1-thread-2 (16)
I am thread with 1200 sleep in iteration 2: SwingWorker-pool-1-thread-3 (17)
I am thread with 500 sleep in iteration 7: SwingWorker-pool-1-thread-1 (15)
.............
150 लाइनों के लिए कुल
और इतने पर (3 कार्यकर्ताओं से प्रत्येक के लिए x 50 पुनरावृत्तियों)
इसके बजाय, उत्पादन मैं मिलता है:
I am thread with 500 sleep in iteration 0: SwingWorker-pool-1-thread-1 (15)
I am thread with 900 sleep in iteration 0: SwingWorker-pool-1-thread-2 (16)
I am thread with 500 sleep in iteration 1: SwingWorker-pool-1-thread-1 (15)
और यही वह है। बस 3 लाइनें इसके बाद कार्यक्रम निकलता है। try catch
ब्लॉक से कहीं भी कोई स्टैकट्रैक नहीं है।
1)। 1200 एमएम के साथ कार्यकर्ता कहाँ सोता है? असल में, अगर मैं 100000 के साथ 1200ms को प्रतिस्थापित करता हूं, तो यह कार्यकर्ता भी 1 पंक्ति प्रिंट करता है ... हाँ, केवल एक। अजीब ...
2)। श्रमिक क्यों रुकते हैं? (और मुझे सामान की 150 लाइनें नहीं मिलती हैं)
मैंने विंडोज 7 64-बिट पर जेआरई 7 अपडेट 11 का उपयोग करके इस कार्यक्रम को चलाया।
पीएस: मुझे पूरा यकीन है कि the bug mentioned here जेआरई के इस संस्करण में तय किया गया था, क्योंकि मुझे कंसोल पर मुद्रित थ्रेड आईडी के रूप में 2 अलग-अलग मान (15 और 16) मिलते हैं। यह पहली बात थी जिस पर मुझे संदेह था।
+1 क्या स्विंगवर्कर का 'doInBackground' गैर-डिमन थ्रेड में निष्पादित करता है? –
@ Eng.Fouad: कृपया संपादित करें देखें। संपादित करें: या जैसा आपने किया है स्रोत को देखें। आपके उत्तर में 1+! –