关于ThreadPoolExecutor

ThreadPoolExcutor为一些Executor提供了基本的实现,ThreadPoolExecutor是一个灵活的健壮的池实现,允许各种各样的用户定制
以下是此线程池的常用构造方法
public ThreadPoolExecutor(   
            int corePoolSize,   
            int maximumPoolSize,   
            long keepAliveTime,   
            TimeUnit unit,   
            BlockingQueue workQueue,
            RejectedExecutionHandler handler)  
如:ThreadPoolExecutor threadPool = new ThreadPoolExecutor(3, 5, 1, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(100),
new ThreadPoolExecutor.CallerRunsPolicy());
相关参数介绍如下:
corePoolSize 线程池维护的核心线程数,也是初始线程数。 
maximumPoolSize线程池维护的最大线程数。 当程序中所需线程超过初始线程时,并且线程队列已满时,线程池能增加到的最大线程数。
keepAliveTime空闲线程结束的超时时间,线程池中如果存在大于初始线程的的空闲线程,在此时间内未有新的执行任务,则会直接释放此线程。 
unit是一个枚举,表示 keepAliveTime 的单位。 可选值如下:

workQueue 表示存放任务的队列。
handler   线程池任务处理的拒绝策略。
其他参数基本如上介绍,下面着重介绍下workQueue和handler参数。
workQueue
当任务数超过核心线程数时,多余的任务会存储在消息队列中,若队列已满,则会创建新线程,但不会超过最大线程数。
ArrayBlockingQueue<Runnable>(capacity)
此队列为有界容量的对列,容量大小即为capacity,当消息很巨大时,能规避资源被耗尽的风险。
LinkedBlockingQueue<Runnable>()
此队列有多个重载方法,可以设置容量大小,如果不设置则是无界的,当不能确定消息容量时,可以使用此消息队列来存储消息。
SynchronousQueue<Runnable>()
此种工作队列绕开了消息队列,当任务来临时直接创建工作线程,此时需要将  maximumPoolSize设置为无限大的值(Integer.MAX_VALUE),来确保所有消息都能执行,此时需要注意资源的监控,防止资源过分占用,影响其他应用的进行。
PriorityBlockingQueue<Runnable>()
handler
当任务数已到达线程池所要求的最大线程数,此刻还有其他任务需要进行,这时就需要调用任务拒绝策略,来对任务进行拒绝操作。以下以一个例子说明
private static final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(1, 2, 1,
            TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(2),
            new ThreadPoolExecutor.CallerRunsPolicy());

    private static volatile int i = 0;

    public static void main(String[] args) {
        for (i = 1; i < 20; i++) {
            System.out.println(i);
            threadPool.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println("任务执行中===" + i);
                }
            });
        }
        threadPool.shutdown();
        while (true) {
            if (threadPool.isTerminated()) {
                break;
            }
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
ThreadPoolExecutor.AbortPolicy :为默认的拒绝处理策略,超过最大线程数处理程序遭到拒绝将抛出RejectedExecutionException运行时异常。可以看出 只能执行部分任务

ThreadPoolExecutor.CallerRunsPolicy :线程调用运行该任务的 execute 本身。此策略提供简单的反馈控制机制,能够减缓新任务的提交速度,但 任务都能执行完毕

ThreadPoolExecutor.DiscardPolicy :不能执行的任务将被删除。可以看出 只能执行部分任务

ThreadPoolExecutor.DiscardOldestPolicy :如果执行程序尚未关闭,则位于工作队列头部的任务将被删除,然后重试执行程序(如果再次失败,则重复此过程)。可以看出 只能执行部分任务

这是在有界ArrayBlockingQueue<Runnable>(2)的情况下执行的四种不同拒绝策略的结果。其他消息队列的情况请自行验证。
另外,不建议使用 ExecutorService创建线程池,此线程池有耗尽资源的风险。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值