Her 10 saniyede bir sabit iş parçacığı havuzu ExecutorService
ve her biri 20 saniye bekleyen ve bunların kesintilerini kaydeden 100 Callable
'luk bir listeye sahibim.Java ExecutorService invokeAll()
Bu listede ayrı bir iş parçacığında invokeAll
numaralı telefonu arıyorum ve hemen hemen bu iş parçacığı araya giriyorum. ExecutorService
yürütme beklendiği gibi kesildi, ancak Callable
s tarafından kaydedilen gerçek kesinti sayısı beklenenden çok daha fazla 10 - yaklaşık 20-40. Neden bu kadar, ExecutorService
aynı anda en fazla 10 iş parçacığı yürütürse?
Tam kaynak:
@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;
}
}
Kullanımı WinXP 32-bit Oracle JRE 1.6.0_27 ve JUnit4
ben hipotezi ile katılmıyorum
Hmm ... ana programa sahip bir programa dönüştürdüğümde, her zaman 10'unu alıyorum ... (Windows 7'de Java 7) –
Aynı işlemi tamamladı 37 (1.6.0_27, Windows XP). Test etmek için Java 7'niz yok mu, birisi onaylayabilir mi? –
Çalışmayı deneyeceğim. Belki de bir Java 6 hatasıdır ... –