package org.springside.modules.utils.concurrent.threadpool;
import static org.assertj.core.api.Assertions.*;
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.TimeUnit;
import org.junit.Test;
import org.springside.modules.utils.concurrent.ThreadUtil;
public class QueuableCachedThreadPoolTest {
public static class LongRunTask implements Runnable {
@Override
public void run() {
ThreadUtil.sleep(5, TimeUnit.SECONDS);
}
}
@Test
public void test() {
QueuableCachedThreadPool threadPool = null;
try {
threadPool = ThreadPoolBuilder.queuableCachedPool().setMinSize(0).setMaxSize(10).setQueueSize(10).build();
// 线程满
for (int i = 0; i < 10; i++) {
threadPool.submit(new LongRunTask());
}
assertThat(threadPool.getActiveCount()).isEqualTo(10);
assertThat(threadPool.getQueue().size()).isEqualTo(0);
// queue 满
for (int i = 0; i < 10; i++) {
threadPool.submit(new LongRunTask());
}
assertThat(threadPool.getActiveCount()).isEqualTo(10);
assertThat(threadPool.getQueue().size()).isEqualTo(10);
// 爆
try {
threadPool.submit(new LongRunTask());
fail("should fail before");
} catch (Throwable t) {
assertThat(t).isInstanceOf(RejectedExecutionException.class);
}
} finally {
ThreadPoolUtil.gracefulShutdown(threadPool, 1000);
}
}
}