मैं चौड़ाई 10 की एक निश्चित थ्रेड पूल ExecutorService
, और 100 Callable
की की एक सूची है, प्रत्येक 20 सेकंड के लिए इंतज़ार कर रहे हैं और उनके बीच में आता है रिकॉर्डिंग की है।जावा ExecutorService invokeAll() में दखल
मैं उस सूची में invokeAll
को एक अलग थ्रेड में कॉल कर रहा हूं, और लगभग तुरंत इस धागे को बाधित करता हूं। ExecutorService
निष्पादन अपेक्षित के रूप में बाधित है, लेकिन Callable
एस द्वारा दर्ज इंटरप्ट की वास्तविक संख्या 10 से लगभग 20-40 की अपेक्षा कहीं अधिक है। ऐसा क्यों है, अगर ExecutorService
एक साथ 10 से अधिक धागे निष्पादित नहीं कर सकता है?
पूर्ण स्रोत:,
@Test
public void interrupt3() throws Exception{
int callableNum = 100;
int executorThreadNum = 10;
final AtomicInteger interruptCounter = new AtomicInteger(0);
final ExecutorService executorService = Executors.newFixedThreadPool(executorThreadNum);
final List <Callable <Object>> executeds = new ArrayList <Callable <Object>>();
for (int i = 0; i < callableNum; ++i) {
executeds.add(new Waiter(interruptCounter));
}
Thread watcher = new Thread(new Runnable() {
@Override
public void run(){
try {
executorService.invokeAll(executeds);
} catch(InterruptedException ex) {
// NOOP
}
}
});
watcher.start();
Thread.sleep(200);
watcher.interrupt();
Thread.sleep(200);
assertEquals(10, interruptCounter.get());
}
// This class just waits for 20 seconds, recording it's interrupts
private class Waiter implements Callable <Object> {
private AtomicInteger interruptCounter;
public Waiter(AtomicInteger interruptCounter){
this.interruptCounter = interruptCounter;
}
@Override
public Object call() throws Exception{
try {
Thread.sleep(20000);
} catch(InterruptedException ex) {
interruptCounter.getAndIncrement();
}
return null;
}
}
का उपयोग WinXP 32-बिट (आप इसे और अधिक है कि संगामिति की वजह से एक बार चलाने के लिए आवश्यकता हो सकती है) ओरेकल JRE 1.6.0_27 और JUnit4
हम्म ... इसे एक मुख्य विधि के साथ एक प्रोग्राम में परिवर्तित करना, मुझे हमेशा 10 मिल रहा है ... (विंडोज़ पर जावा 7) –
वही किया गया, 37 (1.6.0_27, विंडोज एक्सपी) मिला। परीक्षण करने के लिए जावा 7 नहीं है, क्या कोई पुष्टि कर सकता है? –
मैं काम पर कोशिश करूंगा। शायद यह जावा 6 बग है ... –