美文网首页
线程池——ThreadPool

线程池——ThreadPool

作者: Neo_zero | 来源:发表于2017-11-07 23:20 被阅读8次

    为什么要用线程池?

    一个线程的执行过程可以简单概述为:创建线程——》执行任务——》销毁线程。我们只关心执行任务的环节,创建线程销毁线程时间越短、消耗资源越少越好。
    如果并发的线程数量很多,执行时间又比较短时,频繁地创建和销毁线程浪费大量系统资源和时间,大大降低了系统效率。
    所以需要引入线程池。

    线程池帮我们解决了什么问题?

    线程池解决了线程生命周期开销问题和资源不足问题。
    1.通过重用线程,创建线程的时间开销被分摊到了多个任务上,对于每个线程来说,相当于变相减少了创建线程的时间和开销。使系统响应更快。
    2.通过调整线程池核心线程数,可以解决大量创建线程导致的资源不足。

    线程池原理(白话版)

    1. 当初始化一个核心线程数(corePoolSize)为10的线程池时,线程池中没有任务。
    2. 我们重复提交任务到线程池。假设我们的任务都是永不结束的,很快线程池被占满(10),这时阻塞队列(workQueue)派上用场了,暂时无法执行的任务被放在阻塞队列中。
    3. 如果我们继续提交任务,直到把阻塞队列也占满。这时最大线程数(maximumPoolSize)生效,线程池继续创建线程,直到线程数等于maximumPoolSize。
    4. 这时线程池已到达maximumPoolSize,阻塞队列也满了,怎么办呢?线程池(默认)抛出异常,告诉我们:真的不能再接受任务啦!你这个傻叉代码是不是有问题?
    5. 当池中的线程无事可做,超过一定的时间(keepAliveTime),可用线程数大于corePoolSize时,多余的线程会被销毁,直到可用线程数等于corePoolSize。

    线程池实现原理

    未完待续···

    相关文章

      网友评论

          本文标题:线程池——ThreadPool

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