zoukankan      html  css  js  c++  java
  • 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、默默丢弃无法处理的任务,不做任何处理

  • 相关阅读:
    fopen & fcolse & fseek & ftell & fstat 文件操作函数测试
    python基础练习题30道
    2636652995 揭秘骗子qq
    python的异常处理try/except 万能处理exception
    类的装饰器的基本原理
    描述符的应用
    描述符
    组合的方式完成授权
    继承的方式完成包装__attr__
    类的内置方法__attr__介绍
  • 原文地址:https://www.cnblogs.com/Roni-i/p/10475079.html
Copyright © 2011-2022 走看看