• Java线程池使用和常用参数(待续)


    线程池怎么实现的,核心参数讲一讲?

    Executors是线程池的工厂类,通过调用它的静态方法如下:

    Executors.newCachedThreadPool();
    Executors.newFixedThreadPool();

    可返回一个线程池。这些静态方法统一返回一个ThreadPoolExecutor,只是参数不同。

    public ThreadPoolExecutor 
    (int corePoolSize,
    int maximumPoolSize,
    long keepAliveTime,
    TimeUnit unit,
    BlockingQueue<Runnaable> workQueue,
    ThreadFactory threadFactory,
    RejectedExecutionHandler handler){}
        

    1、corePoolSize:指定了线程池中线程的数量

    2、maximumPoolSize:线程池中的最大线程数量

    3、keepAliveTime:当线程池中线程数量超过corePoolSize时,多余的空闲线程的存活时间

    4、unit:上一个参数keepAliveTime的单位

    5、任务队列:被提交还未被执行的任务

    6、threadFactory:线程工厂,用于创建线程,一般默认工厂即可

    7、handler:拒绝策略,当任务太多来不及处理,采用什么方法拒绝任务

    最重要的是任务队列和拒绝策略

    任务队列主要有ArrayBlockingQueue有界队列、LinkedBlockingQueue无界队列、SynchronousQueue直接提交队列。

    1、ArrayBlockingQueue:

    当线程池中实际线程数小于核心线程数时,直接创建线程执行任务;

    当大于核心线程数而小于最大线程数时,提交到任务队列中;

    因为这个队列是有界的,当队列满时,在不大于最大线程的前提下,创建线程执行任务;

    若大于最大线程数,执行拒绝策略。

    2、LinkedBlockingQueue:

    当线程池中实际线程数小于核心线程数时,直接创建线程执行任务;

    当大于核心线程数而小于最大线程数时,提交到任务队列中;

    因为这个队列是无界的,所以之后提交的任务都会进入任务队列中。

    newFixedThreadPool就采用了无界队列,同时指定核心线程和最大线程数一样。

    3、SynchronousQueue:

    该队列没有容量,对提交任务不做保存,直接增加新线程来执行任务。

     newCachedThreadPool使用的是直接提交队列,核心线程数是0,最大线程数是整型的最大值,

    keepAliveTime是60s,因此当新任务提交时,若没有空闲线程都是新增线程来执行任务,

    不过由于核心线程数是0,当60s就会回收空闲线程。

    当线程池中的线程达到最大线程数时,就要开始执行拒绝策略了,如下:

    1、直接抛出异常

    2、在调用者的线程中,运行当前任务

    3、丢弃队列最近的一个任务,也就是将队列头的任务poll出去

    4、默默丢弃无法处理的任务,不做任何处理

  • 相关阅读:
    sql server支持gb18030里面的疑难中文字
    sql:把多列的数据转成行的一个字段
    CVS转SVN
    关于linux语言的设置
    [转]Windows server 2008网络负载均衡集群
    Get和Post、幂等、净荷
    EA经典教程
    Emeditor 斜线显示为人民币符号
    map和set(关于iterator失效的问题)
    scoket和浏览器的连接限制
  • 原文地址:https://www.cnblogs.com/Roni-i/p/10475079.html
Copyright © 2020-2023  润新知