天天看点

Java线程池类ThreadPoolExecutor、ScheduledThreadPoolExecutor及Executors工厂类

java线程池executorservice继承树:

Java线程池类ThreadPoolExecutor、ScheduledThreadPoolExecutor及Executors工厂类

threadpoolexecutor是executorservice的一个实现类,也是java中最常用的线程池类。threadpoolexecutor内部维持了一个线程池,可以执行给定的任务,下面是关于它的具体使用方法。

threadpoolexecutor源码中的构造方法:

Java线程池类ThreadPoolExecutor、ScheduledThreadPoolExecutor及Executors工厂类

threadpoolexecutor线程池中的线程数量是可变的,其变化范围取决于下面两个变量:

具体线程的分配方式是,当一个任务被添加到线程池:

这样,线程池可以动态的调整池中的线程数。除了<code>corepoolsize</code>、<code>maximumpoolsize</code>两个变量外,threadpoolexecutor构造方法还有几个参数:

unit 可选的参数为<code>java.util.concurrent.timeunit</code>中的几个静态属性:

handler 是线程池拒绝处理任务的方式,主要有四种类型:

threadpoolexecutor.abortpolicy()(系统默认):抛出java.util.concurrent.rejectedexecutionexception异常

threadpoolexecutor.callerrunspolicy():当抛出rejectedexecutionexception异常时,会调用rejectedexecution方法

threadpoolexecutor.discardoldestpolicy():抛弃旧的任务

threadpoolexecutor.discardpolicy():抛弃当前的任务

scheduledthreadpoolexecutor是executorservice的另一个实现类,从上面java线程池executorservice继承树这幅图可以看出,scheduledthreadpoolexecutor直接继承自scheduledexecutorservice,scheduledthreadpoolexecutor 类的功能也主要体现在scheduledexecutorservice 接口上,而所以在介绍scheduledthreadpoolexecutor之前先介绍一下scheduledexecutorservice接口。

<code>java.util.concurrent.scheduledexecutorservice</code>接口继承了executorservice,它的最主要的功能就是可以对其中的任务进行调度,比如延迟执行、定时执行等等。

scheduledexecutorservice接口定义:

从上面接口定义我们知道,提供了四个方法,下面我们就分别介绍:

这个方法的意思是在指定延迟之后运行task。这个方法有个问题,就是没有办法获知task的执行结果。如果我们想获得task的执行结果,我们可以传入一个callable的实例(后面会介绍)。

这个方法与<code>schedule (runnable task)</code>类似,也是在指定延迟之后运行task,不过它接收的是一个callable实例,此方法会返回一个schedulefuture对象,通过schedulefuture我们可以取消一个未执行的task,也可以获得这个task的执行结果。

这个方法的作用是周期性的调度task执行。task第一次执行的延迟根据<code>initialdelay</code>参数确定,以后每一次执行都间隔<code>period</code>时长。

如果task的执行时间大于定义的period,那么下一个线程将在当前线程完成之后再执行。整个调度保证不会出现一个以上任务同时执行。

schedulewithfixeddelay的参数和scheduleatfixedrate参数完全一致,它们的不同之处在于对period调度周期的解释。

在scheduleatfixedrate中,period指的两个任务开始执行的时间间隔,也就是当前任务的开始执行时间和下个任务的开始执行时间之间的间隔。

而在schedulewithfixeddelay中,period指的当前任务的结束执行时间到下个任务的开始执行时间。

和executorservice类似, 我们在使用完scheduledexecutorservice时需要关闭它。如果不关闭的话,jvm会一直运行直,即使所有线程已经关闭了。

scheduledthreadpoolexecutor继承自threadpoolexecutor,构造参数很简单,只有3个:

具体使用方法请参考threadpoolexecutor或者使用executors。

创建一个什么样的executorservice的实例(即线程池)需要我们的具体应用场景而定,不过java给我们提供了一个executors工厂类,它可以帮助我们很方便的创建各种类型executorservice线程池,executors一共可以创建下面这四类线程池:

备注:executors只是一个工厂类,它所有的方法返回的都是threadpoolexecutor、scheduledthreadpoolexecutor这两个类的实例。