Java线程池测试-Spring-空闲线程会进队列

结论

场景:想尽量减少队列等待(设置线程队列长度为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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值