Java 多线程学习(二):线程池

2021年11月24日 阅读数:5
这篇文章主要向大家介绍Java 多线程学习(二):线程池,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

(编写时间:2017-11-28 14:21:04)html

JDK1.5中对于多线程编程来讲java引入了新的启动、调度和管理线程的API。Executor框架就是其中之一,其内部使用了一个新的概念Thread Pool(线程池)java

简单来讲,Thread Pool(线程池)就是装着一堆线程的仓库。咱们能够对一个线程进行操做,也能够直接对整个线程池进行操做。为了防止生成的线程过多致使系统错误或者分配线程过少而浪费服务器性能,咱们须要根据任务的不一样对线程池进行合理的配置:数据库

1. 任务优先级
2. 任务执行时间
3. 任务消耗资源类型:CPU、IO、多重混合
4. 任务是否依赖其余服务,例如数据库服务等

线程池的建立

在Executor框架中,线程池由ThreadPoolExecutor(线程池类)实现,其构造方法以下:编程

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

参数说明:服务器

  • corePoolSize: 核心线程数量
  • maximumPoolSize: 最大线程数量
  • keepAliveTime: 超时时间,当线程数量大于核心线程数时,超过该时间的线程将会被kill
  • unit: 超时时间单位
  • workQueue: Runnable工做任务阻塞队列。若是线程池被占满,这个队列将用于存储多余的Runnable工做任务
  • threadFactory: 用于设置建立线程的工厂,能够经过线程工厂给每一个建立出来的线程设置更有意义的名字。
  • handler:饱和策略,当队列和线程池都满了,说明线程池处于饱和状态,那么必须采起一种策略处理提交的新任务。这个策略默认状况下是AbortPolicy,表示没法处理新任务时抛出异常。

在Executor框架中提供了不少种工厂方法,用于建立不一样用途的线程池。为了学习线程池的运行原理,咱们就不在此处使用框架中提供的工厂方法了,若是有须要的朋友能够看文章最后的图表。多线程

线程池的运行

线程池在构造前(new操做)是初始状态,一旦构造完成线程池就进入了执行状态RUNNING。严格意义上讲线程池构造完成后并无线程被当即启动,只有进行"预启动"或者接收到任务的时候才会启动线程。并发

线程池的运行是继承于AbstractExecutorService类,而AbstractExecutorService实现了ExecutorService接口,而后ExecutorService接口又是Executor接口的子类。因此他们的关系以下:框架

ThreadPoolExecutor >ex> AbstractExecutorService >impl> ExecutorService >ex> Executor性能

其中,Executor接口做为顶级接口,它定义了线程执行任务的方法:学习

void execute(Runnable command);

ExecutorService接口在,Executor接口的基础上添加了更多功能包括运行、批量运行和中止等,其中核心的两个运行方法是:

<T> Future<T> submit(Callable<T> task);

Future<?> submit(Runnable task);

相对于Executor接口的execute()方法,ExecutorService接口的submit()的方法会阻塞当前线程,并在线程执行完成任务事后将结果返回为Future接口对象,其中包含了取消任务、判断当前任务是否被取消、判断当前任务是否完成等功能。

线程池的关闭

线程池的关闭方法是在ExecutorService接口中定义的:

void shutdown();

List<Runnable> shutdownNow();

其中:

  • shutdown方法:平缓的关闭线程池。表示中止线程池接收新的任务,同时等待全部任务执行完成,包括在阻塞队列中等待的任务。在此方法运行过程当中,线程池的状态为SHUTDOWN。
  • shutdownNow方法:当即关闭线程池。表示中止线程池接收新的任务,同时取消全部执行中的任务,包括在阻塞队列中等待的任务,而且返回从未执行过的任务列表。在此方法执行过程当中,线程池的状态为STOP。

最后

Executor框架提供的默认线程池工厂方法图表(图片源自博客:并发新特性—Executor框架与线程池):

结束

本文部分文原本源于互联网

感谢如下文章提供的灵感和帮助