寒玉 Blog
  • Home
  • Books
  • About Me
  • Categories
  • Tags
  • Archives

Java线程池原理及简单介绍


线程池简介

多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。 假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间。 如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服务器性能。 一个线程池包括以下四个基本组成部分:

1. 线程池管理器(ThreadPool):用于创建并管理线程池,包括 创建线程池,销毁线程池,添加新任务;
2. 工作线程(PoolWorker):线程池中线程,在没有任务时处于等待状态,可以循环的执行任务;
3. 任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等
4. 任务队列(taskQueue):用于存放没有处理的任务。提供一种缓冲机制。

线程池技术正是关注如何缩短或调整T1,T3时间的技术,从而提高服务器程序性能的。它把T1,T3分别安排在服务器程序的启动和结束的时间段或者一些空闲的时间段,这样在服务器程序处理客户请求时,不会有T1,T3的开销了。

继承体系

线程池所涉及到的类和接口并不是很多,其集成体系也比较简单,相关继承关系如下:

2019-12-31-10-09-30

如上图,最顶层的接口Executor仅仅声明了一个方法executor.ExecutorService接口在其父类接口的基础上,声明了包含但不限于shutdown,submit,invokeAll,invokeAny等方法.至于ScheduledExecutorService接口,则是声明了一些和定时任务相关的方法.比如schedule和scheduleAtFixedRate.线程池的核心实现是在ThreadPoolExecutor类中.我们使用Executors调用newFixThreadPool,newSingleThreadExecutor和newCacheedThreadPool等方法创建的线程池均是ThreadPoolExecutor类型.

原理分析

核心参数分析

线程池的核心实现即ThreadPoolExecutor类.该类包含了几个核心的属性,这些属性可在构造方法进行初始化.在介绍核心属性前,可以先看看ThreadPoolExecutor的构造方法,如下:

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler)

构造方法的参数即核心参数,这里我用一个表格来简要说明一下各个参数的意义。如下:

参数 说明
!corePoolSize 核心线程数。当线程数小于该值时,线程池会优先创建新线程来执行新任务
maximumPoolSize 线程池所能维护的最大线程数
keepAliveTime 空闲线程的存活时间
workQueue 任务队列,用于缓存未执行的任务
threadFactory 线程工厂。可通过工厂为新建的线程设置更有意义的名字
handler 拒绝策略。当线程池和任务队列均处于饱和状态时,使用拒绝策略处理新任务。默认是 AbortPolicy,即直接抛出异常

线程创建规则

资源回收

排队策略

拒绝策略

提交任务

关闭线程池

几种线程池

重要操作

参考

  • Java线程池原理分析

  • « Kylo的安装
  • 使用python链接stompy »

Published

4 28, 2019

Category

java

Tags

  • java 15
  • Powered by Pelican. Theme: Elegant by Talha Mansoor