Java并发类库提供的线程池有哪几种? 分别有什么特点?

Java并发类库提供的线程池有哪几种? 分别有什么特点?

创建或销毁线程存在一定的开销,所以利用线程池技术来提高系统资源利用效率,并简化线程管理,已经是非常成熟的选择

今天我要问你的问题是,Java并发类库提供的线程池有哪几种? 分别有什么特点?

典型回答

  • 通常开发者都是利用Executors提供的通用线程池创建方法,去创建不同配置的线程池,主要区别在于不同的ExecutorService类型或者不同的初始参数
  • Executors目前提供了5种不同的线程池创建配置:
    • newCachedThreadPool(),它是一种用来处理大量短时间工作任务的线程池,具有几个鲜明特点:它会试图缓存线程并重用,当无缓存线程可用时,就会创建新的工作线程;如果线程闲置的时间超过60秒,则被终止并移出缓存;长时间闲置时,这种线程池,不会消耗什么资源。其内部使用SynchronousQueue作为工作队列
    • newFixedThreadPool(int nThreads),重用指定数目(nThreads)的线程,其背后使用的是无界的工作队列,任何时候最多有nThreads个工作线程是活动的。这意味着,如果任务数量超过了活动队列数目,将在工作队列中等待空闲线程出现;如果有工作线程退出,将会有新的工作线程被创建,以补足指定的数目nThreads
    • newSingleThreadExecutor(),它的特点在于工作线程数目被限制为1,操作一个无界的工作队列,所以它保证了所有任务的都是被顺序执行,最多会有一个任务处于活动状态,并且不允许使用者改动线程池实例,因此可以避免其改变线程数目
    • newSingleThreadScheduledExecutor()和newScheduledThreadPool(int corePoolSize),创建的是个ScheduledExecutorService,可以进行定时或周期性的工作调度,区别在于单一工作线程还是多个工作线程
    • newWorkStealingPool(int parallelism),这是一个经常被人忽略的线程池,Java 8才加入这个创建方法,其内部会构建ForkJoinPool,利用Work-Stealing算法,并行地处理任务,不保证处理顺序

考点分析

  • Java并发包中的Executor框架无疑是并发编程中的重点,今天的题目考察的是对几种标准线程池的了解,我提供的是一个针对最常见的应用方式的回答
  • 在大多数应用场景下,使用Executors提供的5个静态工厂方法就足够了,但是仍然可能需要直接利用ThreadPoolExecutor等构造函数创建,这就要求你对线程构造方式有进一步的了解,你需要明白线程池的设计和结构
  • 另外,线程池这个定义就是个容易让人误解的术语,因为ExecutorService除了通常意义上“池”的功能,还提供了更全面的线程管理、任务提交等方法
  • Executor框架可不仅仅是线程池,我觉得至少下面几点值得深入学习:
    • 掌握Executor框架的主要内容,至少要了解组成与职责,掌握基本开发用例中的使用
    • 对线程池和相关并发工具类型的理解,甚至是源码层面的掌握
    • 实践中有哪些常见问题,基本的诊断思路是怎样的
    • 如何根据自身应用特点合理使用线程池

你可能感兴趣的:(面试技巧,java,开发语言,maven,eclipse,数据库)