Ich habe einen Beispielcode.ThreadPoolExecutor Java
@Test
public void testWithBlockQueue() throws InterruptedException {
String poolFormat = "ServiceTaskPool-%d";
int coreSize = 3;
int maxSize = 3;
int queueSize = 1;
int idleThreadLiveInSecond = 35;
ThreadFactory factory = new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
return new Thread(r);
}
};
ArrayBlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(queueSize);
final ThreadPoolExecutor service = new ThreadPoolExecutor(coreSize, maxSize, idleThreadLiveInSecond,
TimeUnit.SECONDS, queue, factory, new ThreadPoolExecutor.AbortPolicy());
service.allowCoreThreadTimeOut(true);
passTask(coreSize, service);
Thread.sleep(5000);
passTask(coreSize, service);
System.out.printf("Thread pool state %s", service);
Thread.sleep(6000);
}
protected void passTask(int coreSize, ThreadPoolExecutor service) {
for (int i=0; i < coreSize; i++) {
service.execute(new Runnable() {
@Override
public void run() {
System.out.printf("Simple printf from %s \n", Thread.currentThread().getName());
}
});
}
}
Wenn ich QUEUESIZE Set 2, ich habe Ausnahme, weil ThreadPoolExecutor nicht eine Aufgabe in der Warteschlange einfügen, wenn ich gesetzt QUEUESIZE 3 in Ordnung ist. Ich verstehe nicht warum, wenn ich MaxSize = 4 setze, ist der Test in Ordnung. Es ist von der Dokumentation.
- Wenn die Anzahl der Threads ist kleiner als die corePoolSize, erstellen Sie ein neues Thema eine neue Aufgabe auszuführen. Wenn die Anzahl der Threads gleich (oder größer) ist als corePoolSize, setzen Sie die Task in die Warteschlange.
- Wenn die Warteschlange voll ist, und die Anzahl der Gewindegänge geringer ist als die MaxPoolSize Erstellen eines neuen Threads in Aufgaben auszuführen.
- Wenn die Warteschlange voll ist, und die Anzahl der Gewindegänge größer oder gleich Verwerfen Sie die Aufgabe bis maxPoolSize.