java线程池生成线程的时机

java线程池生成线程的时机

直接上结论:
1.当前线程数<核心线程数时,进来1个任务即生成一个核心线程。
2.线程数达到核心线程数,但阻塞队列没有满,线程数不变。
3.阻塞队列满了,每进来1个任务便生成1个线程,但不会超过最大线程。
4.当前线程数=最大线程数,阻塞队列也满了,那么新来的任务将进入抛弃策略。

验证环节

示例代码块
public class MyThreadPoolExecutorTest {

    private static AtomicInteger nextId = new AtomicInteger(0);
    private static AtomicInteger abandonId = new AtomicInteger(0);
    
    private static int coreSize = 3;
    private static int maxSize = 10;
    private static int aliveTime = 10;
    private static int queueCapacity = 100;
    private static int taskCount = 1000;

    public static void main(String[] args) {
        ThreadPoolExecutor mThreadPool = new ThreadPoolExecutor(coreSize, maxSize, aliveTime, TimeUnit.SECONDS,
                new ArrayBlockingQueue<Runnable>(queueCapacity),
                //线程工厂
                (task) -> {
                    String name = "MyThread-" + nextId.getAndIncrement();
                    Thread thread = new Thread(null, task, name, 0);
                    System.out.println(thread.getName());
                    return thread;
                },
                //抛弃策略
                (task, executor) -> {
                    abandonId.getAndIncrement();
                    //System.out.println("abandon!");
                });
        for (int i = 0; i < taskCount; i++) {
            mThreadPool.execute(() -> {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
        System.out.println("abandon:" + abandonId.get());
        mThreadPool.shutdown();
    }
}
1.当前线程数<核心线程数时,进来1个任务即生成一个核心线程。
参数设置:
private static int coreSize = 3;
private static int maxSize = 10;
private static int aliveTime = 10;
private static int queueCapacity = 100;
private static int taskCount = 2;

结果:
MyThread-0
MyThread-1
abandon:0
2.线程数达到核心线程数,但阻塞队列没有满,线程数不变。
参数设置:
private static int coreSize = 3;
private static int maxSize = 10;
private static int aliveTime = 10;
private static int queueCapacity = 1000;
private static int taskCount = 1000;

结果:
MyThread-0
MyThread-1
MyThread-2
abandon:0

注:1000(阻塞队列数)+3(核心线程数)>1000(任务数)

3.阻塞队列满了,每进来1个任务便生成1个线程,但不会超过最大线程。
参数设置:
private static int coreSize = 3;
private static int maxSize = 10;
private static int aliveTime = 10;
private static int queueCapacity = 6;
private static int taskCount = 10;

结果:
MyThread-0
MyThread-1
MyThread-2
MyThread-3
abandon:0

注:此处10-6-3=1,所以会出现第四个线程。但是如果机器性能比较差,可能运行到此处时前面已经有任务完成了,核心线程多接管了1个任务,便不会生成新线程。

4.当前线程数=最大线程数,阻塞队列也满了,那么新来的任务将进入抛弃策略
参数设置:
private static int coreSize = 3;
private static int maxSize = 10;
private static int aliveTime = 10;
private static int queueCapacity = 100;
private static int taskCount = 1000;

结果:
MyThread-0
MyThread-1
MyThread-2
MyThread-3
MyThread-4
MyThread-5
MyThread-6
MyThread-7
MyThread-8
MyThread-9
abandon:890

注:1000-10(最大线程数)-100(阻塞队列里存储100个任务)=890。但是如果机器性能比较差,可能运行到此处时前面已经有任务完成了,线程多接管了任务,便可能小于此值。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值