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

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

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

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

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

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

【面试题】说说线程池的底层工作原理可以吗?_第1张图片

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

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

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

你可能感兴趣的:(线程)