转载

jdk线程池

线程池状态

jdk线程池

  • RUNNING:线程池初始化时的状态,此时可接受新的任务,也能处理任务队列中的任务。
  • SHUTDOWN:调用shutdown方法后进入该状态,此时不再接受新的任务,但还会处理完任务队列中剩余的任务。
  • STOP:调用shutdownNow方法后进入该状态,此时不再接受新的任务,也不会处理任务队列中剩余的任务。
  • TIDYING:此时所有任务都已终止,workerCount为零,线程池进入该状态后将运行terminate方法并进入TIDYING状态。
  • TERMINATED:terminated方法执行完毕后进入该状态。
//线程池的状态
    private static final int RUNNING    = -1 << COUNT_BITS;     //高三位111
    private static final int SHUTDOWN   =  0 << COUNT_BITS;     //高三位000
    private static final int STOP       =  1 << COUNT_BITS;     //高三位001
    private static final int TIDYING    =  2 << COUNT_BITS;     //高三位010
    private static final int TERMINATED =  3 << COUNT_BITS;     //高三位011

ThreadPoolExecutor构造函数

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler)
  • corePoolSize:线程池里面保持运行的线程数 , 默认情况下,线程池是空的,当有任务提交时才会创建线程,如果当前 线程数量小于corePoolSize,则创建核心线程,核心线程会在线程池中一直存活,即使它们处于闲置状态,除非设置了 allowCoreThreadTimeOut.
  • maximumPoolSize:线程池允许的最大的线程数,当前poolSize达到core pool size的时候, 新任务来但是队列满了, 就要看maximumPoolSize了, 如果此时poolSize
  • keepAliveTime:当前线程数大于core时, 闲置的线程最大的等待新任务来到的时间 , 超过时间后闲置线程会被关闭
  • unit:keepAliveTime的单位, TimeUnit有定义
  • BlockingQueue:任务(Runnable任务 ,执行execute提交的任务)执行前会放在工作队列当中
  • ThreadFactory:默认是使用DefaultThreadFactory创建线程
  • RejectedExecutionHandler:当任务 Executor. execute无法受理,例如队列满了等情况则执行拒绝策略,默认使用AbortPolicy.

    • CallerRunsPolicy:提交任务的线程执行提交的任务
    • AbortPolicy:中止执行且抛出异常
    • DiscardPolicy:不处理该任务
    • DiscardOldestPolicy:抛弃最老的任务再次提交当前任务

阻塞队列

  • SynchronousQueue:这个队列接收到任务的时候,会直接提交给线程处理,当所有线程都在工作时,为了保证线程数<= maximumPoolSize,使用这个类型队列的时候,maximumPoolSize一般指定成Integer.MAX_VALUE,即无限大
  • LinkedBlockingQueue:这个队列接收到任务的时候,如果当前线程数小于核心线程数,则新建线程(核心线程)处理任务;如果当前线程数等于核心线程数,则进入队列等待。由于这个队列没有最大值限制,即所有超过核心 线程数的任务都将被添加到队列中,这也就导致了maximumPoolSize的设定失效,因为总线程数永远不会超过 corePoolSize
  • ArrayBlockingQueue:可以限定队列的长度,接收到任务的时候,如果没有达到corePoolSize的值,则新 建线程(核心线程)执行任务,如果达到了,则入队等候,如果队列已满,则新建线程(非核心线程)执行任务,又如 果总线程数到了maximumPoolSize,并且队列也满了,则发生错误
  • DelayQueue:队列内元素必须实现Delayed接口,这就意味着你传进去的任务必须先实现Delayed接口。这 个队列接收到任务时,首先先入队,只有达到了指定的延时时间,才会执行任务
原文  https://segmentfault.com/a/1190000021291167
正文到此结束
Loading...