【语言】Java线程池简介

4 篇文章 0 订阅

2018.10.29

前言

并发问题是项目开发中的常见问题,Java的java.util.concurrent包提供了许多可靠、实用的工具给开发者。粗略地看了文档和代码,决定写下这篇简介,但是出于时间成本的考虑,本文未涵盖代码案例及测试分析等内容。

万恶之源的Executor接口

下图是Executor接口及其相关接口、类的UML图1Executor作为最顶层的接口,顾名思义就是执行某个可执行命令(Runnable线程)的执行器。

Executor接口相关接口、类的UML图

ExecutorService接口则是在Executor的基础上,提供这个可执行命令的管理方法,主要是启停操作。到此,ExecutorService接口满足了对线程生命周期基本的管理需求,调度相关的需求由ScheduledExecutorService接口来补充。

AbstractExecutorService抽象类是ExecutorService的默认实现。子类ForkJoinPool的特点是支持任务窃取机制(Work-Stealing),对于那些大量产生子任务的任务,该子类采用的任务窃取机制会有助于提高整体的性能表现。而本文的主角ThreadPoolExecutor类,作为一个线程池则适用于大量异步任务执行的场景,具体原因有待实验验证。

Executors血汗工厂

使用Java的Executors工厂方法创建ExecutorService实例,可以减少开发者对参数的理解成本和选型成本。常用的有如下几个:

  • newSingleThreadExecutor:是一个只有一个线程的线程池,使用上,就是一个可自主管控的线程,可直接控制启停、判断状态等。
  • newFixedThreadPool:固定大小的线程池,当需要控制并发度或在并发度不高的场景下,就可以采用该线程池。
  • newCachedThreadPool:缓存线程池,这里的缓存是指当线程执行完任务之后,还会留在线程池中,对于短寿异步任务较多的场景,这个线程池能带来可观的性能提升;而且线程池大小不受限,最大能包含Integer.MAX_VALUE个线程。

以上三个线程池本质上都是ThreadPoolExecutor,只是配置不同。而还有其它线程池,如基于ForkJoinPoolnewWorkStealingPool,不作过多介绍,读者可按需深入了解。


  1. UML图 ↩︎

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值