java并发编程:ThreadPoolExcutor创建线程池

1、ThreadPoolExcutor创建线程池

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

参数讲解:

(1)int corePoolSize(核心线程数):

线程池新建线程的时候,如果当前线程总数小于corePoolSize,则新建的是核心线程,核心线程默认情况下会一直存活在线程池中;如果设置了 allowCoreThreadTimeOut 为 true,那么核心线程如果不干活的话,超过一定时间,就会被销毁掉。

(2)int maximumPoolSize(线程池能容纳的最大线程数量):

线程总数 = 核心线程数 + 非核心线程数。

(3)long keepAliveTime(非核心线程空闲存活时长):

非核心线程空闲时长超过该时长将会被回收

(4)TimeUnit unit 空闲线程的存活时间

在这里表示的是时间的单位,比如说秒。

(5)BlockingQueue workQueue(任务队列):

当所有的核心线程都在干活时,新添加的任务会被添加到这个队列中等待处理,如果队列满了,则新建非核心线程执行任务。常用的workQueue类型:

①SynchornousQueue:这里表示接到新任务,直接交给线程处理,如果其他的线程都在工作,那就创建一个新的线程来处理这个任务。

②LinkedBlockingQueue:这里表示接到新任务,如果当前线程数小于核心线程数,则新建核心线程处理任务;如果当前线程数等于核心线程数,则进入队列等待。

③ArrayBlockingQueue:这里表示接到新任务,如果没有达到核心线程数,则新建核心线程执行任务,如果达到了,则入队等候,如果队列已满,则新建非核心线程执行任务,又如果总线程数到了 maximumPoolSize,并且队列也满了,则发生错误。

④DelayQueue:这里表示接到新任务,先入队,达到了指定的延时时间,才执行任务。

6.ThreadFactory threadFactory(线程工厂)

用来创建线程池中的线程。

7.RejectedExecutionHandler handler(拒绝策略):

指的之超过了maximumPoolSize,无法再处理新的任务,就会直接拒绝,提供了以下 4 种策略:

①AbortPolicy:默认策略,在拒绝任务时,会抛出RejectedExecutionException。

②CallerRunsPolicy:只要线程池未关闭,该策略直接在调用者线程中,运行当前的被丢弃的任务。

③DiscardOldestPolicy:该策略将丢弃最老的一个请求,也就是即将被执行的任务,并尝试再次提交当前任务。

④DiscardPolicy:该策略默默的丢弃无法处理的任务,不予任何处理。

 

样例:

public class ThreadPoolUtil {

    /**
     * 线程缓冲队列
     */
    private static BlockingQueue bqueue = new ArrayBlockingQueue(100);
    /**
     * 核心线程数,会一直存活,即使没有任务,线程池也会维护线程的最少数量
     */
    private static final int SIZE_CORE_POOL = 5;
    /**
     * 线程池维护线程的最大数量
     */
    private static final int SIZE_MAX_POOL = 10;
    /**
     * 线程池维护线程所允许的空闲时间
     */
    private static final long ALIVE_TIME = 2000;

    private static ThreadPoolExecutor pool = new ThreadPoolExecutor(SIZE_CORE_POOL, SIZE_MAX_POOL, ALIVE_TIME, TimeUnit.MILLISECONDS, bqueue, new ThreadPoolExecutor.CallerRunsPolicy());

    static {

        pool.prestartAllCoreThreads();
    }

    public static ThreadPoolExecutor getPool() {
        return pool;
    }
}

 

你可能感兴趣的:(Java并发编程)