结论
场景:想尽量减少队列等待(设置线程队列长度为1),直接用线程池处理,并发数量设置的够用(示例设置4个线程),期望在4个请求内,应该都不进入等待队列。
结论证明是错误的:在空余线程够用(小于4)的情况下,依然会先进入队列,并且超出队列长度1后,会发生拒绝。
测试代码
JAVA
``` package fly.sample.thread;
import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.ArrayList; import java.util.List; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger;
/** * org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor 的内部实现 */ public class SpringThreadPoolTest { public static void main(String[] args) throws Exception { ApplicationContext factory = new ClassPathXmlApplicationContext("classpath:spring-pool.xml"); ThreadPoolTaskExecutor executor = factory.getBean("threadPoolTaskExecutor", ThreadPoolTaskExecutor.class); List futures = new ArrayList<>(); long stime = System.currentTimeMillis(); System.out.println("第一批"); for (int i = 1; i <= 10; i++) { try { Future future = executor.submit(new MyCallable(i)); futures.add(future); System.out.println("时间:" + (System.currentTimeMillis() - stime) + " " + "提交成功:" + i + " " + executor.getThreadPoolExecutor()); } catch (Exception e) { System.out.println("时间:" + (System.currentTimeMillis() - stime) + " " + "提交失败:" + i + " " + e.getMessage()); // e.printStackTrace(); }
}
Thread.sleep(205);
System.out.println("第二批");
for (int i = 11; i <= 20; i++) {
try {
Future<Integer> future = executor.submit(new MyCallable(i));
futures.add(future);
System.out.println("时间:" + (System.currentTimeMillis() - stime) + " " + "提交成功:" + i + " " + executor.getThreadPoolExecutor());
} catch (Exception e) {
System.out.println("时间:" + (System.currentTimeMillis() - stime) + " " + "提交失败:" + i + " " + e.getMessage());
// e.printStackTrace(); }
}
System.out.println(futures.size());
for (Future future : futures) {
System.out.println("时间:" + (System.currentTimeMillis() - stime) + " " + "get:" + future.get(105, TimeUnit.MILLISECONDS));
}
}
static class MyCallable implements Callable {
int result = 0;
public MyCal