【并发】Java线程池

线程池顾名思义就是指管理一组同构工作线程的资源池,线程池与工作队列(Work Queue)密切相关,工作队列中保存了所有等待执行的任务。线程池管理的线程的任务就是从工作队列中获取一个任务、执行任务,然后返回线程池并等待下一个任务。

 

一、线程池的优势

1、减少线程的创建与销毁所带来的开销,同时任务不需要等待线程创建的时间而可以直接执行,只要有空闲线程的话

2、减少空闲活跃线程所带来的CPU资源浪费

3、可以防止过多线程占用过多内存而导致OOM异常

 

二、Executor框架

Executor框架是JUC里面对于构建灵活强大的异步任务执行框架提供基础的类,将任务执行的主要抽象从Thread转化成Executor,这样做可以为不同类型的任务提供多种不同类型的执行策略,并将人物的提交过程与执行过程解耦开来,并提供任务执行的整个生命周期过程的控制和监控等。

Executor接口源码:

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

Executor接口源码很简单,就只是包含了一个execute函数,将任务用Runnable来表示。

Executor的主要作用就是创建线程来执行任务,但没有提供相应的方法来结束线程,但JVM必须等待所有非守护线程全部终止后才会退出,如果Executor创建的线程没有办法正常退出的话,JVM就无法结束。为了解决这个问题,线程池中用扩展了Executor接口的ExecutorService来作为任务执行的抽象,将Executor的执行分为三个生命周期:运行、关闭和已终止,并提供一系列的方法来管理生命周期,以及一些用于提交任务的方法。

public interface ExecutorService extends Executor {
    void shutdown();    //平缓关闭线程池,不再接受新任务,同时等待已提交的任务执行完毕
    List<Runnable> shutdownNow();    //粗暴关闭线程池,尝试取消所有运行中的人物,返回未开始的任务
    boolean isShutdown();    //判断是否处于关闭状态
    boolean isTerminated();    //判断是否处于已终止状态
    boolean awaitTermination(long timeout, TimeUnit unit)    //等待ExectorService到达终止状态
        throws InterruptedException;
    <T> Future<T> submit(Callable<T> task);    //提交Callable任务
    <T> Future<T> submit(Runnable task, T result);    //提交Runnable任务,并将结果保存在result中
    Future<?> submit(Runnable task);    //提交Runnable任务并返回Future类型结果
    <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,
                    long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
}

 

三、线程池的种类

Executors类中提供了多种不同类型的线程池以根据不同的运行环境、业务需求来处理不同类型的任务,这些线程池的创建主要就是调用ThreadPoolExecutor函数,通过调整不同的参数来创建不同类型的线程池,除了Executors提供的多种创建方式,还可以通过ThreadPoolExecutor函数来自定义线程池。

  • ThreadPoolExecutor
    public ThreadPoolExecutor(int corePoolSize,    //线程池基本大小
                              int maximumPoolSize,    //线程池最大大小
                              long keepAliveTime,    //存活时间(线程空闲允许的时间)
                              TimeUnit unit,    //线程等待时间
                              BlockingQueue<Runnable> workQueue,    //任务队列
                              ThreadFactory threadFactory,    //线程工厂
                              RejectedExecutionHandler handler    //任务拒绝处理器) { ... }

 

1、newFixedThreadPool

创建固定大小的线程池,每当提交一个任务时就创建一个线程,直到达到最大数量,如果某个线程非正常结束,线程池就会补充一个新的线程。

    public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }

 

2、newWorkStealingPool

创建一个提供足够县城以支持给定的并行级别的线程池,可通过多个队列来减少资源争夺的情况,不保证提交任务的执行顺序。

    public static ExecutorService newWorkStealingPool(int parallelism) {
        return new ForkJoinPool
            (parallelism,
             ForkJoinPool.defaultForkJoinWorkerThreadFactory,
             null, true);
    }

 

3、newSingleThreadExecutor

创建一个单线程的Executor,当这个线程非正常结束时会创建另一个线程来代替。

    public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }

 

4、newCachedThreadPool

创建一个可缓存的线程池,理论上线程池没有上限(Integer.MAX_VALUE),如果当前线程池的规模超过处理需求的时候,线程池就会自动回收空闲线程。

    public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }

 

5、newSingleThreadScheduledExecutor

创建一个单线程的Executor用来处理以延迟或定时的方式来执行任务。

    public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
        return new DelegatedScheduledExecutorService
            (new ScheduledThreadPoolExecutor(1));
    }

 

6、newScheduledThreadPool

创建一个固定长度的线程池用来处理以延迟或定时的方式来执行任务。

    public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
        return new ScheduledThreadPoolExecutor(corePoolSize);
    }

 

 

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