ThreadPoolExecutor线程池的示例分析

技术ThreadPoolExecutor线程池的示例分析小编给大家分享一下ThreadPoolExecutor线程池的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获

是范仲淹还是范仲淹线程池执行程序朱庇特谢尼德谢尼德,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,你是说.-你好-你好,范仲淹是范仲淹还是范仲淹!

线程池参数

线程池执行程序范国泰范国泰范国泰,你是说.(嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨):

/**

*创建一个新的{ @ codethreads poolexecutor }并从第九个开始

*参数。

*

* @ paramcorepolsizethnumberfthread stoeepinthepool,甚至

*如果空闲,除非{ @ codeallowcorethread超时}是一个

* @ paramaximummpolsixtmaximumromingstorallowin

*池

* @ paramckeepalivetimenumberfthreftssisse大于

*核心,这是一个复杂的线程

*将等待新任务开始.

{ @ codekeepalivetime }的* @ paramunitetimeunit参数

* @ paramworkquequequequeueefrooftrhodintaskssborestyare

*执行此问题将保持{ @代码可运行}

* tasksesebmi tdbyte { @ code execute }方法。

* @ param线程工厂工厂wheetly performer(执行程式)

*createsanewthread

* @ parametehandlerstouwhenexequation被锁定-参数处理程式图征处理程式图征处理程式图征处理程式图征处理程式图征处理程式图征处理程式图征处理程式图征处理程式图征处理程式图征处理程式图征处理程式图征

*由于边界和电容的限制

* @抛出非法

ArgumentException 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.corePoolSize = corePoolSize;
    this.maximumPoolSize = maximumPoolSize;
    this.workQueue = workQueue;
    this.keepAliveTime = unit.toNanos(keepAliveTime);
    this.threadFactory = threadFactory;
    this.handler = handler;
}

其实从构造方法的注释中,我们就能知道每个参数的意思:

  • corePoolSize:保留在线程池中的线程数量,即使它们是闲置的,除非allowCoreThreadTimeOut被设置。

  • maximumPoolSize:线程池允许的最大线程数。

  • keepAliveTime:当线程数大于corePoolSize时,那些额外的空闲线程在停止前等待新任务的最大时间。

  • unit:keepAliveTime参数的时间单位。

  • workQueue:在任务执行之前,用于保存任务的队列,队列只会保存那些使用execute方法提交的可执行的任务。

  • threadFactory:当线程池创建一个新线程时所用到的工厂。

  • handler:当任务的执行因为线程数量和队列容量到达边界而被阻止时,所调用的handler。

线程池工作原理

当一个新任务被提交时:

  1. 当前活跃线程数<corePoolSize,则创建一个新线程执行新任务;

  2. 当前活跃线程数>corePoolSize,且队列(workQueue)未满时,则将新任务放入队列中;

  3. 当前活跃线程数>corePoolSize,且队列(workQueue)已满,且当前活跃线程数<maximumPoolSize,则继续创建一个新线程执行新任务;

  4. 当前活跃线程数>corePoolSize,且队列(workQueue)已满,且当前活跃线程数=maximumPoolSize,则执行拒绝策略(handler);

当任务执行完成后:

  1. 超出corePoolSize的空闲线程,在等待新任务时,如果超出了keepAliveTime,则线程会被销毁;

  2. 如果allowCoreThreadTimeOut被设置为true,那么corePoolSize以内的空闲线程,如果超出了keepAliveTime,则同样会被销毁。

线程池队列

通过构造方法可以知道,workQueue参数是BlockingQueue<Runnable>类型的,而BlockingQueue是JUC包里的一个接口,其实现有:

ThreadPoolExecutor线程池的示例分析

其中,常用的队列如下:

  1. ArrayBlockingQueue:规定大小的BlockingQueue,其构造必须指定大小。其所含的对象是FIFO顺序排序的。

  2. LinkedBlockingQueue:大小不固定的BlockingQueue,若其构造时指定大小,生成的BlockingQueue有大小限制,不指定大小,其大小有Integer.MAX_VALUE来决定。其所含的对象是FIFO顺序排序的。

  3. PriorityBlockingQueue:类似于LinkedBlockingQueue,但是其所含对象的排序不是FIFO,而是依据对象的自然顺序或者构造函数的Comparator决定。

  4. SynchronizedQueue:特殊的BlockingQueue,对其的操作必须是放和取交替完成。

线程池拒绝策略

同样,通过构造方法可以知道,handler参数是RejectedExecutionHandler类型的,而RejectedExecutionHandler同样是JUC包里的一个接口,其实现有:

ThreadPoolExecutor线程池的示例分析

  1. DiscardOldestPolicy:丢掉缓存在队列中的最早的任务,然后重新尝试运行新任务。

  2. AbortPolicy:直接拒绝添加新任务,并抛出异常。

  3. CallerRunsPolicy:使用当前线程执行该任务,而不是使用线程池中的线程。

  4. DiscardPolicy:删除提交的新任务 。

以上是“ThreadPoolExecutor线程池的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/98522.html

(0)

相关推荐

  • 比尔吉沃特是几区,LOL新手推荐去哪个区

    技术比尔吉沃特是几区,LOL新手推荐去哪个区先来给大家介绍一下联盟各大区英雄联盟国服总共有27个区 电信比尔吉沃特是几区:艾欧尼亚 祖安 诺克萨斯 班德尔城 皮尔特沃夫 战争学院 巨神峰 雷瑟守备 钢铁烈阳

    生活 2021年10月25日
  • 同性恋的原因,为啥现在的同性恋那么多

    技术同性恋的原因,为啥现在的同性恋那么多同性恋产生的原因至今尚无肯定的学说,一般认为与以下因素有关同性恋的原因:
    (1)遗传因素,有人发现同性恋者在单卵双生子中远比双卵双生子中多见,而且男同性恋可能是母系遗传的。
    (2)

    生活 2021年10月30日
  • 怎样鉴别银手镯的真假,如何鉴定自己买的银手镯是真假

    技术怎样鉴别银手镯的真假,如何鉴定自己买的银手镯是真假颜色怎样鉴别银手镯的真假、柔韧性好在挑选白银手镯时,首先可以看它的颜色,纯度越高,颜色就越洁白,但很容易被氧化,而呈现黑色,尽管被氧化过色泽有些黑但很光亮。真正的纯银

    生活 2021年10月30日
  • 黑盒测试、白盒测试与灰盒测试方法

    技术黑盒测试、白盒测试与灰盒测试方法 黑盒测试、白盒测试与灰盒测试方法测试奇谭,BUG不见。
    大家好,我是谭叔。
    对于黑盒、白盒与灰盒测试方法的理解,几年前我在某乎做过一个概念性的回答,当时提问者询问:

    礼包 2021年12月24日
  • qt的tcp通信编程(qt串口通信代码)

    技术QT5实现UDP通信的示例代码怎么写QT5实现UDP通信的示例代码怎么写,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。前言该例程经过实际

    攻略 2021年12月15日
  • 实例方法在Python类中的是如何工作的

    技术实例方法在Python类中的是如何工作的这篇文章给大家介绍实例方法在Python类中的是如何工作的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。在OO(面向对象)编程中,类中的方法有多种形式:实

    攻略 2021年11月12日