线程池

作者: 孤独的根号十二 | 来源:发表于2018-12-17 18:36 被阅读5次

    目录:

    1.线程池的作用
    2.线程池的种类
    3.线程池的使用

    线程池的作用:

    线程主要是通过控制执行的线程的数量,超出数量的线程排队等候,等待有任务执行完毕,再从队列最前面取出任务执行,减少创建和销毁线程的次数,每个工作线程可以多次使用,可根据系统情况调整执行的线程数量,防止消耗过多内存

    线程池的种类

    1.newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
    2.newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
    3.newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
    4.newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

    线程池的使用

    1.线程池的创建

    1. 通过Executors创建
    2. 通过new 创建
     Executor THREAD_POOL_EXECUTOR
            = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,
                    TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);
    

    参数说明:

    CORE_POOL_SIZE 核心线程数
    MAXIMUM_POOL_SIZE 最大线程数量
    KEEP_ALIVE 闲置回收时间
    TimeUnit.SECONDS 时间单位
    sPoolWorkQueue 异步任务队列
    sThreadFactory 线程工厂

    如果当前线程池中的数量小于corePoolSize,创建并添加的任务。
    如果当前线程池中的数量等于corePoolSize,缓冲队列 workQueue未满,那么任务被放入缓冲队列、等待任务调度执行。
    如果当前线程池中的数量大于corePoolSize,缓冲队列workQueue已满,并且线程池中的数量小于maximumPoolSize,新提交任务会创建新线程执行任务。
    如果当前线程池中的数量大于corePoolSize,缓冲队列workQueue已满,并且线程池中的数量等于maximumPoolSize,新提交任务由Handler处理。
    当线程池中的线程大于corePoolSize时,多余线程空闲时间超过keepAliveTime时,会关闭这部分线程。

    问题:

    1. ExecutorService 的submit() 与execute()区别
      接收的参数不一样 submit()可以接受runnable无返回值和callable有返回值
      execute()只能接受runnable 无返回值
      submit有返回值,而execute没有,而且submit方便Exception处理

    2.shotdown() showdownNow()区别

    shutdown() 方法在终止前允许执行以前提交的任务,
    shutdownNow() 方法阻止等待任务启动并试图停止当前正在执行的任务。在终止时执行程序没有任务在执行,也没有任务在等待执行,并且无法提交新任务。关闭未使用的 ExecutorService 以允许回收其资源。

    相关文章

      网友评论

          本文标题:线程池

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