美文网首页
每日一结——Executors,ThreadPoolExecut

每日一结——Executors,ThreadPoolExecut

作者: 奔向学霸的路上 | 来源:发表于2020-07-23 14:22 被阅读0次

Executors

Executors创建线程池

Executors提供了4种创建线程池的方法:

  • newCachedThreadPool:创建一个可缓存的线程池,如果线程在60秒之后依旧空闲,那么就会被移除,在执行新的任务时,有活跃的线程就使用该线程,否则就新建一条线程。
 /**
     * Creates a thread pool that creates new threads as needed, but
     * will reuse previously constructed threads when they are
     * available.  These pools will typically improve the performance
     * of programs that execute many short-lived asynchronous tasks.
     * Calls to {@code execute} will reuse previously constructed
     * threads if available. If no existing thread is available, a new
     * thread will be created and added to the pool. Threads that have
     * not been used for sixty seconds are terminated and removed from
     * the cache. Thus, a pool that remains idle for long enough will
     * not consume any resources. Note that pools with similar
     * properties but different details (for example, timeout parameters)
     * may be created using {@link ThreadPoolExecutor} constructors.
     *
     * @return the newly created thread pool
     */
    public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }
  • newFixedThreadPool:创建一个nThreads定长线程池,核心线程数等于最大线程数,如果超出nThreads,则在队列中等待,队列是无界队列。
/**
     * Creates a thread pool that reuses a fixed number of threads
     * operating off a shared unbounded queue.  At any point, at most
     * {@code nThreads} threads will be active processing tasks.
     * If additional tasks are submitted when all threads are active,
     * they will wait in the queue until a thread is available.
     * If any thread terminates due to a failure during execution
     * prior to shutdown, a new one will take its place if needed to
     * execute subsequent tasks.  The threads in the pool will exist
     * until it is explicitly {@link ExecutorService#shutdown shutdown}.
     *
     * @param nThreads the number of threads in the pool
     * @return the newly created thread pool
     * @throws IllegalArgumentException if {@code nThreads <= 0}
     */
    public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }
  • newScheduledThreadPool :创建一个指定核心线程数的线程池,可结合ScheduledExecutorService来支持定时及周期性任务执行。


    ScheduledExecutorService方法图
/**
     * Creates a thread pool that can schedule commands to run after a
     * given delay, or to execute periodically.
     * @param corePoolSize the number of threads to keep in the pool,
     * even if they are idle
     * @return a newly created scheduled thread pool
     * @throws IllegalArgumentException if {@code corePoolSize < 0}
     */
    public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
        return new ScheduledThreadPoolExecutor(corePoolSize);
    }

/**
     * Creates a new {@code ScheduledThreadPoolExecutor} with the
     * given core pool size.
     *
     * @param corePoolSize the number of threads to keep in the pool, even
     *        if they are idle, unless {@code allowCoreThreadTimeOut} is set
     * @throws IllegalArgumentException if {@code corePoolSize < 0}
     */
    public ScheduledThreadPoolExecutor(int corePoolSize) {
        super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
              new DelayedWorkQueue());
    }
  • newSingleThreadExecutor:创建一个单线程的线程池,队列LinkedBlockingQueue,一个几乎认为容量很大的队列。
 /**
     * Creates an Executor that uses a single worker thread operating
     * off an unbounded queue. (Note however that if this single
     * thread terminates due to a failure during execution prior to
     * shutdown, a new one will take its place if needed to execute
     * subsequent tasks.)  Tasks are guaranteed to execute
     * sequentially, and no more than one task will be active at any
     * given time. Unlike the otherwise equivalent
     * {@code newFixedThreadPool(1)} the returned executor is
     * guaranteed not to be reconfigurable to use additional threads.
     *
     * @return the newly created single-threaded Executor
     */
    public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }
  • newSingleThreadScheduledExecutor:创建一个可定期执行的单线程的线程池。
/**
     * Creates a single-threaded executor that can schedule commands
     * to run after a given delay, or to execute periodically.
     * (Note however that if this single
     * thread terminates due to a failure during execution prior to
     * shutdown, a new one will take its place if needed to execute
     * subsequent tasks.)  Tasks are guaranteed to execute
     * sequentially, and no more than one task will be active at any
     * given time. Unlike the otherwise equivalent
     * {@code newScheduledThreadPool(1)} the returned executor is
     * guaranteed not to be reconfigurable to use additional threads.
     * @return the newly created scheduled executor
     */
    public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
        return new DelegatedScheduledExecutorService
            (new ScheduledThreadPoolExecutor(1));
    }

ThreadPoolExecutor

类图

ThreadPoolExecutor主要是针对7个参数含义的解读:

  • corePoolSize:即使没有空闲,保持在线程池中的核心线程数量,除非设置了allowCoreThreadTimeOut
  • maximumPoolSize:线程池中的最大线程数
  • keepAliveTime:当线程数大于核心数时,这是多余的空闲线程在终止之前等待新任务的最长时间。
  • unit:keepAliveTime的单位
  • workQueue:在执行任务之前用于保留任务的队列。此队列将仅保存execute方法提交的Runnable任务。
  • threadFactory:创建新线程时要使用的工厂
  • handler:超过线程边界和队列容量而在执行阻止任务时使用的处理程序

If fewer than corePoolSize threads are running, the Executor always prefers adding a new thread rather than queuing.
如果运行中的线程数<核心线程数,添加新线程;

If corePoolSize or more threads are running, the Executor always prefers queuing a request rather than adding a new thread.
如果运行中的线程数>核心线程数,添加队列中;

If a request cannot be queued, a new thread is created unless this would exceed maximumPoolSize, in which case, the task will be rejected.
如果队列中没法再添加,且运行中的线程数<最大线程数,添加新线程;
如果队列中没法再添加,且运行中的线程数>最大线程数,拒绝策略。

corePoolSize -> 任务队列 -> maximumPoolSize -> 拒绝策略

/**
     * Creates a new {@code ThreadPoolExecutor} with the given initial
     * parameters.
     *
     * @param corePoolSize the number of threads to keep in the pool, even
     *        if they are idle, unless {@code allowCoreThreadTimeOut} is set
     * @param maximumPoolSize the maximum number of threads to allow in the
     *        pool
     * @param keepAliveTime when the number of threads is greater than
     *        the core, this is the maximum time that excess idle threads
     *        will wait for new tasks before terminating.
     * @param unit the time unit for the {@code keepAliveTime} argument
     * @param workQueue the queue to use for holding tasks before they are
     *        executed.  This queue will hold only the {@code Runnable}
     *        tasks submitted by the {@code execute} method.
     * @param threadFactory the factory to use when the executor
     *        creates a new thread
     * @param handler the handler to use when execution is blocked
     *        because the thread bounds and queue capacities are reached
     * @throws IllegalArgumentException if one of the following holds:<br>
     *         {@code corePoolSize < 0}<br>
     *         {@code keepAliveTime < 0}<br>
     *         {@code maximumPoolSize <= 0}<br>
     *         {@code maximumPoolSize < corePoolSize}
     * @throws NullPointerException if {@code workQueue}
     *         or {@code threadFactory} or {@code handler} is null
     */
    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {
        if (corePoolSize < 0 ||
            maximumPoolSize <= 0 ||
            maximumPoolSize < corePoolSize ||
            keepAliveTime < 0)
            throw new IllegalArgumentException();
        if (workQueue == null || threadFactory == null || handler == null)
            throw new NullPointerException();
        this.acc = System.getSecurityManager() == null ?
                null :
                AccessController.getContext();
        this.corePoolSize = corePoolSize;
        this.maximumPoolSize = maximumPoolSize;
        this.workQueue = workQueue;
        this.keepAliveTime = unit.toNanos(keepAliveTime);
        this.threadFactory = threadFactory;
        this.handler = handler;
    }

相关文章

  • 每日一结——Executors,ThreadPoolExecut

    Executors Executors提供了4种创建线程池的方法: newCachedThreadPool:创建一...

  • Java8线程池理解(一)

    ThreadPoolExecutor类 java.uitl.concurrent.ThreadPoolExecut...

  • 2018-12-25_ThreadPoolExecutor

    ThreadPoolExecutor构造函数 一.(1) (2) (3) (4) ThreadPoolExecut...

  • Java Consurrency 《Thread Pool Ex

    Java Consurrency 《Thread Pool Executors》 Executors 为 Exec...

  • IT 每日一结

    Java中构建Java bean时总需要一大堆getter setter或者toString Equals方法等。...

  • 每日一结

    许久不曾看书,突然间要做例会分享,那么,是布鲁克林,还是瓦尔登,还是改变。不说准备的如何,发现,原以为懂得,其实并...

  • 每日一结

    所谓的剁手时刻,便是从商场里出来,拿着大堆的零食... 下午去的有点早,扫除过后,还能静静地打个表格。 之前那位七...

  • 每日一结

    特殊的一天,校长生日。 在犹豫中抵达琴苑,早早迎来较为枯燥的开端,貌似,不知道做了些什么。很尴尬没有网络的时候,有...

  • 每日一结

    做了一天的表格,全程迷蒙状态... 毕竟是男孩子,还是家里未来的柱子,工作选择便很重要。虽然我对钱没什么概念,但是...

  • 每日一结

    拾人牙慧也好,感恩之心也好。 作为母亲节的今天,张淼老师为孩子准备了康乃馨,送给他们的妈妈。温馨,周到。 最近,头...

网友评论

      本文标题:每日一结——Executors,ThreadPoolExecut

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