I have wrote code sample:
class Test {
public static void main(String[] args) throws InterruptedException {
ThreadPoolExecutor executorService = new ThreadPoolExecutor(0, 100,
2L, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>());
executorService.allowCoreThreadTimeOut(true);
CountDownLatch countDownLatch = new CountDownLatch(20);
long l = System.currentTimeMillis();
for (int i = 0; i < 20; i++) {
Thread.sleep(100);
executorService.submit(new Runnable() {
@Override
public void run() {
try {
countDownLatch.countDown();
Thread.sleep(500);
} catch (Exception e) {
System.out.println(e);
}
}
});
}
executorService.shutdown();
countDownLatch.await();
System.out.println((System.currentTimeMillis() - l) / 100);
}
}
Each 100 ms submits new task(overall task quantity - 20). Each task duration - 0.5 sec. thus 5 task can be executed in parallel and best execution time will be: 20*100+500 = 2.5 sec and pool should create 5 threads
But my experiment shows 9.6 sec.
I opened the jsvisualvm
to see how many threads pool creates and I see that only one thread was created:
please correct where my threadPooll configuration incorrect.