java线程池

原生的线程池

    private static ExecutorService executor = new ThreadPoolExecutor(
        5,
        10,
        0,
        TimeUnit.MILLISECONDS,
        new ArrayBlockingQueue<Runnable>(5),
        new ThreadPoolExecutor.AbortPolicy()
    );
    其中参数的含义如下,

  • corePoolSize 线程池维护线程的最少数量
  • maximumPoolSize 线城市维护线程的最大数量
  • keepAliverTime 线程池维护线程所允许的空闲时间
  • unit 线程池维护线程所允许的空闲时间的单位
  • workQueue 线程池所使用的缓冲队列
  • handler 线程池对拒绝任务的处理策略
    那么线程池是如何工作的呢?
  1. 如果当前线程池中的线程数小于corePoolSize,则即使当前线程池中的线程处于空闲状态,也会创建一个新的线程来处理。
  2. 如果当前线程池中的线程数等于corePoolSize,但是缓冲队列workQueue未满,则新的任务会被加入到缓冲队列
  3. 如果当前线程池中的线程数等于或大于corePoolSize,且此时缓冲队列workQueue已满,线程总数小于maximumPoolSize,则会新建线程处理新任务
  4. 如果当前线程池中的线程数等于或大于corePoolSize,且此时缓冲队列workQueue已满,线程总数等于maximumPoolSize,则会通过handler配置的策略来处理
  5. 如果当前线程池中的线程数大于corePoolSize,且空闲时间达到keepAliverTime,则线程将被终止
    因此,综合来讲,处理任务的优先级为:corePoolSize -> workQueue -> maximumPoolSize
java四种线程池
    java有四种线程池:newSingleThreadExecutor(单线程的线程池)、newFixedThreadExecutor(固定数量的线程池)、newCacheThreadExecutor(可缓存线程池)、newScheduleThreadExecutor(大小无限制的线程池),下面针对每一种线程池进行分别讲解:
newSingleThreadExecutor是单线程的线程池,他本身是通过设置corePoolSize=1且maximumPoolSize=1,且实现的是LinkedBlockingQueue这个无界的队列实现。
    public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }
newFixedThreadExecutor是固定数量的线程池,类似于newSingleThreadExecutor,可以理解newSingleThreadExecutor就是一种特殊的newFixedThreadExecutor,实现方式也是一致的。超过nThreads的部分,在LinkedBlockingQueue队列中等待。
    public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }
newCacheThreadExecutor是可缓存的线程池,其实现是通过SynchronousQueue,因此队列中本身不会有等待,新的任务会直接创建新的线程来处理,这样做的风险是极端情况下可能会使服务线程数暴涨,导致内存不够创建线程,导致OOM。
    public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }
newScheduleThreadExecutor大小无限制的线程池,本身支持定期及周期性执行任务。
    public ScheduledThreadPoolExecutor(int corePoolSize) {
        super(corePoolSize, Integer.MAX_VALUE, 0, TimeUnit.NANOSECONDS,
              new DelayedWorkQueue());
    }

workQueue的讨论
    queue有三种类型,包括直接提交(SynchronousQueue)、无界队列(LinkedBlockingQueue)、有界队列(ArrayBlockingQueue)。

参考
http://blog.csdn.net/madman188/article/details/51220144
http://blog.csdn.net/yinwenjie/article/details/50522458
http://www.cnblogs.com/guguli/p/5198894.html





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值