私は、固定スレッドプールExecutorService
の幅が10であり、リストは100 Callable
であり、それぞれ20秒待って割り込みを記録しています。Java ExecutorService invokeAll()interrupting
私は別のスレッドで、そのリストにinvokeAll
を呼び出し、そしてほとんどすぐにこのスレッドを中断しています。予想通りExecutorService
実行が中断されますが、Callable
秒で記録された割り込みの実際の数は、10予想よりはるかに多い - 周りの20-40を。 ExecutorService
が同時に10個以上のスレッドを実行できない場合はどうしてですか?
完全なソース:(あなたが原因同時実行にもう一度それを、それを実行する必要があります)
WinXPの32ビットを使用して@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;
}
}
、オラクルJRE 1.6.0_27とJUnit4
Hmm ...メインメソッドを使ってプログラムに変換すると、私は常に10を得ています...(WindowsのJava 7) –
同じことを行って、37(1.6.0_27、Windows XP)を取得しました。テストするJava 7を持っていない、誰かが確認できますか? –
私は仕事に挑戦します。多分Java 6のバグです... –