Tengo un grupo de subprocesos fijos ExecutorService
de ancho 10 y una lista de 100 Callable
, cada uno esperando 20 segundos y registrando sus interrupciones.Java ExecutorService invokeAll() interrupción
Estoy llamando a invokeAll
en esa lista en un hilo separado, e interrumpiendo casi inmediatamente este hilo. ExecutorService
ejecución se interrumpe como se esperaba, pero el número real de interrupciones registradas por Callable
s es mucho más de lo esperado 10 - alrededor de 20-40. ¿Por qué es así, si ExecutorService
puede ejecutar no más de 10 hilos simultáneamente?
fuente completo: (Puede que tenga que ejecutar más de una vez debido a la concurrencia)
@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;
}
}
Usando WinXP 32 bits, Oracle JRE 1.6.0_27 y junit4
Hmm ... convirtiéndolo en un programa con un método principal, siempre recibo 10 ... (Java 7 en Windows) –
Hecho lo mismo, tengo 37 (1.6.0_27, Windows XP). No tiene que probar Java 7, ¿alguien puede confirmarlo? –
Lo intentaré en el trabajo. Tal vez sea un error de Java 6 ... –