Java线程池(1)——线程池中的几个重要类

【内容摘要】

在java中,如果需要进行多线程编程,可以采用java自带的线程池来实现,线程池对于我们新手来说是一个非常好的选择,因为我们可以不用关心线程池中线程是如何调度的,避免在多线程编程过程产生死锁等问题。在了解线程池的使用前,本文首先介绍一下java线程池的内部原理。

【正文】

一、Java线程池中的几个重要类

1.ThreadPoolExecutor类

ThreadPoolExecutor类是java线程池中最核心的一个类,它提供了四个构造函数如下:

public class ThreadPoolExecutor extends AbstractExecutorService {
    .....
    //构造器1
    public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
            BlockingQueue<Runnable> workQueue);
    //构造器2
    public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
            BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory);
    //构造器3
    public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
            BlockingQueue<Runnable> workQueue,RejectedExecutionHandler handler);
    //构造器4
    public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
        BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler);
    ...
}

由构造函数可知,ThreadPoolExecutor继承了AbstractExecutorService类,构造器中各个参数的含义如下:
(1)corePoolSize:核心池的大小,在创建了线程池后,默认情况下,线程池中并没有任何线程,而是等待有任务到来才创建线程去执行任务,除非调用了prestartAllCoreThreads()或者prestartCoreThread()方法,从这2个方法的名字就可以看出,是预创建线程的意思,即在没有任务到来之前就创建corePoolSize个线程或者一个线程。默认情况下,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务,当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列workQueue当中,后面会详细介绍该队列;
(2)maximumPoolSize:线程池最大线程数,它表示在线程池中最多能创建多少个线程;
(3)keepAliveTime:表示线程没有任务执行时最多保持多久时间会终止。默认情况下,只有当线程池中的线程数大于corePoolSize时,keepAliveTime才会起作用,直到线程池中的线程数大于corePoolSize,即当线程池中的线程数大于corePoolSize时,如果一个线程空闲的时间达到keepAliveTime,则会终止,直到线程池中的线程数不超过corePoolSize。但是如果调用了allowCoreThreadTimeOut(boolean)方法,在线程池中的线程数不大于corePoolSize时,keepAliveTime参数也会起作用,直到线程池中的线程数为0;
(4)unit:参数keepAliveTime的时间单位,取值如:TimeUnit.DAYS、TimeUnit.HOURS等
(5)workQueue:一个阻塞队列,用来存储等待执行的任务,阻塞队列有以下几种选择:ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue。线程池的排队策略与workQueue有关。
(6)threadFactory:线程工厂,主要用来创建线程;
(7)handler:表示当拒绝处理任务时的策略,有以下四种取值:
□ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
□ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
□ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
□ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务

2.AbstractExecutorService抽象类

ThreadPoolExecutor类继承了抽象类AbstractExecutorService,其实现简略如下:

public abstract class AbstractExecutorService implements ExecutorService {     
    protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {};
    protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {};
    public Future<?> submit(Runnable task) {};
    public <T> Future<T> submit(Runnable task, T result) {};
    public <T> Future<T> submit(Callable<T> task) {};
    private <T> T doInvokeAny(Collection<? extends Callable<T>> tasks,boolean timed, long nanos) throws InterruptedException, ExecutionException, TimeoutException {};
    public <T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException {};
    public <T> T invokeAny(Collection<? extends Callable<T>> tasks,long timeout, TimeUnit unit) throws InterruptedException,ExecutionException, TimeoutException {};
    public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException {};
    public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,long timeout, TimeUnit unit) throws InterruptedException {};
}

3.ExecutorService接口

AbstractExecutorService抽象类实现的是ExecutorService接口,在这个接口中,定义了如下方法:

public interface ExecutorService extends Executor {

    void shutdown();
    boolean isShutdown();
    boolean isTerminated();
    boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException;
    <T> Future<T> submit(Callable<T> task);
    <T> Future<T> submit(Runnable task, T result);
    Future<?> submit(Runnable task);
    <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException;
    <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,long timeout, TimeUnit unit)throws InterruptedException;
    <T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException;
    <T> T invokeAny(Collection<? extends Callable<T>> tasks,long timeout, TimeUnit unit) throws InterruptedException,ExecutionException, TimeoutException;
}

4.Executor接口

Executor是一个顶层接口,在它里面只声明了一个方法execute(Runnable),如下:

public interface Executor {
    void execute(Runnable command);
}

从字面意思可以理解,就是用来执行传进去的任务的;

至此,可以看出Executor、ExecutorService、AbstractExecutorService和ThreadPoolExecutor之间的关系:Executor是一个顶层接口,ExecutorService实现了Executor接口;然后,AbstractExecutorService实现了ExecutorService接口,但并未实现具体内容,最后的具体实现由ThreadPoolExecutor来执行。

【参考文献】

http://www.cnblogs.com/dolphin0520/p/3932921.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章