每日一面——谈谈你对线程池的理解(上)

菜鸡每日一面系列打卡22

每天一道面试题目 

助力小伙伴轻松拿offer

坚持就是胜利,我们一起努力!

题目描述

谈谈你对线程池的理解(上)。

题目分析

终于写到线程池了,同数据库连接池一样,线程池也是池化技术的一个经典应用。这里面有很多设计技巧和细节,值得好好琢磨。当然,这些也是面试官考查的热点问题。

鉴于线程池相关的内容非常之多,菜鸡将其分为上下两篇,本文将主要讲述线程池的概念,Java中的线程池以及线程池的生命周期。

题目解答

01

什么是线程池

Brian Goetz在《Java并发编程实战》一书中对线程池的论述一针见血,我们一起来欣赏一下。

线程池,从字面含义来看,是指管理一组同构工作线程的资源池。线程池是与工作队列密切相关的,其中在工作队列中保存了所有等待执行的任务。工作者线程的任务很简单:从工作队列中获取一个任务,执行任务,然后返回线程池并等待下一个任务。

“在线程池中执行任务”“为每个任务分配一个线程”优势更多。通过重用现有的线程而不是创建新线程,可以在处理多个请求时分摊在线程创建和销毁过程中产生的巨大开销。另一个额外的好处是。当请求到达时,工作线程通常已经存在,因此不会由于等待创建线程而延迟任务的执行,从而提高了响应性。通过适当调整线程池的大小,可以创建足够多的线程以便使处理器保持忙碌状态,同时还可以防止过多线程相互竞争资源而使应用程序耗尽内存或失败。

以上两段话很概括地讲了线程池的概念,基本原理和优势。接下来,我们需要具体了解一下Java中的线程池。

02

Java中的线程池

在分析具体的线程池的实现之前,我们先通过一张图,把握一下线程池相关类和接口的整体关系。

JDK对线程池提供了有效的支持。我们可以通过Executors类中的静态工厂方法来创建线程池,下图展示了常用的四种静态工厂方法,我们将一一对其进行说明。

  • newFixedThreadPool:创建固定长度的线程池,每当提交一个任务就创建一个线程,直到达到线程池的最大数量后不再变化。

  • newSingleThreadExecutor:单线程的Executor,创建单个工作线程执行任务,可以确保按照任务在队列中的顺序来串行执行。

  • newCachedThreadPool:创建可缓存的线程池,如果线程池的当前规模超过处理需求时,回收空闲线程,反之,创建新的线程。

  • newScheduledThreadPool:创建固定长度的线程池,并且能以延迟或定时的方式执行任务。

03

Executor的生命周期

Executor接口极其简单,但却是一个非常重要的概念,它可以说是线程池体系的基础,那么,我们来研究一下它的一生。在学习Executor的生命周期的过程中,菜鸡发现了《Java并发编程实战》中文版中的一个失误,书中称,“为了解决执行服务的生命周期问题,Executor扩展了ExecutorService接口”,事实上恰恰相反,菜鸡认为,“为了解决执行服务的生命周期问题,ExecutorService扩展了Executor接口”。

ExecutorService的生命周期有3种状态:运行、关闭和已终止。

  • 运行ExecutorService在创建之后处于运行状态。

  • 关闭:调用shutdown方法进入关闭状态(不再接受新任务,但已接受的任务包括未开始执行的任务会继续执行);调用shutdownNow方法进入关闭状态(尝试取消所有运行中和尚未执行的任务)

  • 已终止ExecutorService关闭之后,在所有任务完成之后,进入终止状态。

以上便是菜鸡对线程池的总结上篇,供大家参考,下篇更精彩哦!

学习 | 工作 | 分享

????长按关注“有理想的菜鸡

只有你想不到,没有你学不到

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章