测试特性
- 最大线程数量为n,有界队列为m,当向线程池提交n+m个任务时,线程池中的线程池大小为n
环境
- jdk 1.8
- maven
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
测试
测试用例
package concurrent;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import util.StdOut;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
public class ThreadPoolExecutorTest {
private final AtomicInteger pooledThreadIdx = new AtomicInteger(0);
private final int coreSizeN = 1;
private final int maxSizeN = 3;
private final int queueSizeM = 10;
private final long keepAliveTime = 60L * 1000;
private ThreadPoolExecutor threadPoolExecutor;
private final AtomicBoolean pass = new AtomicBoolean(false);
@Before
public void before() {
threadPoolExecutor = new ThreadPoolExecutor(
coreSizeN,
maxSizeN,
keepAliveTime,
TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<>(queueSizeM),
r -> new Thread(r, "executor-tester-" + pooledThreadIdx.getAndIncrement()),
new ThreadPoolExecutor.AbortPolicy()
);
}
@Test
public void testThreadCountGreaterThanCoreSize() throws InterruptedException {
submitTask(threadPoolExecutor, pass, maxSizeN + queueSizeM);
startControlThread(pass, maxSizeN, threadPoolExecutor);
}
private void submitTask(ThreadPoolExecutor threadPoolExecutor, AtomicBoolean pass, int taskCount) {
for (int i = 0; i < taskCount; i++) {
threadPoolExecutor.submit(() -> {
while (!pass.get()) {
StdOut.println(Thread.currentThread().getName() + ": Thread running..." );
sleep(1000);
}
});
}
}
public static void sleep(long millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void startControlThread(AtomicBoolean pass, int maxSizeN, ThreadPoolExecutor threadPoolExecutor) throws InterruptedException {
Thread controlThread = new Thread(() -> {
int i = 0;
while (i++ < 10) {
sleep(1000);
Assert.assertEquals(maxSizeN, threadPoolExecutor.getActiveCount());
StdOut.println("thread pool running workers: " + threadPoolExecutor.getActiveCount());
}
pass.set(true);
i = 0;
while (i++ < 10) {
sleep(200);
StdOut.println("thread pool running workers: " + threadPoolExecutor.getActiveCount());
}
Assert.assertEquals(0, threadPoolExecutor.getActiveCount());
StdOut.println("thread pool running workers: " + threadPoolExecutor.getActiveCount());
});
controlThread.start();
controlThread.join();
}
}
Console输出
executor-tester-0: Thread running...
executor-tester-1: Thread running...
executor-tester-2: Thread running...
executor-tester-2: Thread running...
executor-tester-1: Thread running...
executor-tester-0: Thread running...
thread pool running workers: 3
executor-tester-0: Thread running...
thread pool running workers: 3
executor-tester-2: Thread running...
executor-tester-1: Thread running...
executor-tester-2: Thread running...
executor-tester-1: Thread running...
executor-tester-0: Thread running...
thread pool running workers: 3
executor-tester-2: Thread running...
thread pool running workers: 3
executor-tester-1: Thread running...
executor-tester-0: Thread running...
executor-tester-2: Thread running...
executor-tester-1: Thread running...
executor-tester-0: Thread running...
thread pool running workers: 3
executor-tester-0: Thread running...
thread pool running workers: 3
executor-tester-1: Thread running...
executor-tester-2: Thread running...
executor-tester-2: Thread running...
thread pool running workers: 3
executor-tester-0: Thread running...
executor-tester-1: Thread running...
executor-tester-2: Thread running...
executor-tester-1: Thread running...
executor-tester-0: Thread running...
thread pool running workers: 3
executor-tester-0: Thread running...
executor-tester-1: Thread running...
thread pool running workers: 3
executor-tester-2: Thread running...
executor-tester-1: Thread running...
executor-tester-0: Thread running...
executor-tester-2: Thread running...
thread pool running workers: 3
thread pool running workers: 3
thread pool running workers: 3
thread pool running workers: 3
thread pool running workers: 3
thread pool running workers: 0
thread pool running workers: 0
thread pool running workers: 0
thread pool running workers: 0
thread pool running workers: 0
thread pool running workers: 0
thread pool running workers: 0