Ho un pool di thread fisso ExecutorService
di larghezza 10 e un elenco di 100 Callable
, ciascuno in attesa di 20 secondi e la registrazione dei loro interrupt.Java ExecutorService invokeAll() che interrompe
Sto chiamando invokeAll
in tale elenco in una discussione separata e interrompendo quasi immediatamente questa discussione. ExecutorService
l'esecuzione è interrotta come previsto, ma il numero effettivo di interruzioni registrato da Callable
s è molto più del previsto 10 - circa 20-40. Perché è così, se ExecutorService
può eseguire non più di 10 thread contemporaneamente?
sorgente completo: (Potrebbe essere necessario eseguire più di una volta a causa della concorrenza)
@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;
}
}
Utilizzando WinXP 32-bit, Oracle JRE 1.6.0_27 e JUnit4
Hmm ... convertendolo in un programma con un metodo principale, ottengo sempre 10 ... (Java 7 su Windows) –
Fatto lo stesso, ottenuto 37 (1.6.0_27, Windows XP). Non hai un Java 7 da testare, qualcuno può confermare? –
Proverò al lavoro. Forse è un bug di Java 6 ... –