【面试题】说说线程池的底层工作原理可以吗?

系统不可能无限创建很多的线程,会构建一个线程池,有一定数量的线程,让他们执行各种各样的任务,线程执行完任务之后,不会销毁自己,继续等待执行下一个任务。

频繁的创建线程、销毁线程,会导致开销浪费

ExecutorService threadPool = Executors.newFixedThreadPool(10);//10表示核心线程池数,corePoolSize
threadPool.submit(new Callable(){
    public void run(){
        
    }
});

线程池刚创建时,是没有线程的,而且会自带一个空的队列(阻塞队列)

队列可以为无界队列,也可以是有界队列

当前线程数小于核心线程数时,当提交新任务过来后,会创建一个新的线程去执行任务,执行完了就尝试从无界的LinkedBlockingQueue里获取新的任务,如果没有新的任务,此时就会发生阻塞直到线程池里有新的任务。

当前线程数已达到核心线程数时,当提交新任务过来时,会将任务放入阻塞队列中。当有线程执行完任务后,不会直接销毁,而是会争抢获取任务执行。如果所有线程此时都在执行任务,那么无界队列中的任务可能会越来越多。如果阻塞队列是有限的,那么当阻塞队列满了之后,会检查核心线程池是否已满,满了,会创建额外的线程放入线程池中

相对于FixedThreadPool,它的队列LinkedBlockingQueue无界阻塞队列,就是说队列是无限大的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值