美文网首页
线程池学习笔记

线程池学习笔记

作者: ssochi | 来源:发表于2019-11-21 14:45 被阅读0次

ThreadPoolExecutor

核心参数

  • corePoolSize 核心线程数,初始化就生产corePoolSize个线程。此后若线程池数量大于corePoolSize并处于idle状态超过keepAliveTime,则回收这些无用的线程
  • maximumPoolSize 最大线程数
  • keepAliveTime 可以处于idle的时间
  • workQueue(blockingQueue)
  • ThreadFactory
  • rejectHander 拒绝策略

常用线程池种类

fixed 固定线程数量线程池

corePoolSize = fixedNum
maximumPoolSize = fixedNum

single 单线程池

corePoolSize = 1
maximumPoolSize = 1

cached 缓存线程池

corePoolSize = 0
maximumPoolSize = Integer.MAX_VALUE

拒绝策略

rejectHander 拒绝策略,线程池关闭或线程池中的队列满了,并且线程数大于maximumPoolSize时,对这些任务的处理策略
默认使用AbortPolicy,任务超出时直接抛异常。
DiscardPolicy 什么也不做,直接抛弃
DiscardOldestPolicy 抛弃最老的策略
当然也可以自定义策略

使用Executor创建的线程均使用LinkedBlockingQueue,并且queue的最大容量=Integer.MAX_VALUE,因此无法触发拒绝策略。

shutDown

停止接受任务,执行完当前所有任务后关闭

shutDownNow

丢弃所有任务,直接关闭

submit

public void execute(Runnable command) {
        if (command == null)
            throw new NullPointerException();
        int c = ctl.get();
        if (workerCountOf(c) < corePoolSize) {
            if (addWorker(command, true))
                return;
            c = ctl.get();
        }
        if (isRunning(c) && workQueue.offer(command)) {
            int recheck = ctl.get();
            if (! isRunning(recheck) && remove(command))
                reject(command);
            else if (workerCountOf(recheck) == 0)
                addWorker(null, false);
        }
        else if (!addWorker(command, false))
            reject(command);
    }
  1. 如果线程数小于corePoolSize则创建一个新线程,并执行这个任务。
  2. 如果线程数大于或等于corePoolSize则将新任务放入等待队列中。
  3. 如果队列已满,就尝试创建新的线程来执行这个任务。但若线程数已经大于MaximumPoolSize,则拒绝该任务。(addWorker中判断了线程数)

相关文章

网友评论

      本文标题:线程池学习笔记

      本文链接:https://www.haomeiwen.com/subject/rsktwctx.html