为什么要使用线程池?
    假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间。如果:T1 + T3 远大于 T2,那么系统的大部分时间都花在了创建和销毁上,造成性能上的浪费。
    而如果并发的线程数量很多,如果允许所有并发请求都通过创建新线程来处理,那么这时候我们没有限制系统内的并发执行线程的数量,无限制的线程可能耗尽系统资源,如 CPU 时间和内存。并且如果每个线程都是执行一个时间很短的任务就结束了,那么频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。此时我们就可以使用线程池技术。

    什么是线程池?
    线程池的主要思想是:在进程开始时创建一定数量的线程,并加到池中以等待工作。当服务器收到请求时,它会唤醒池内的一个线程(如果有可用线程),并将需要服务的请求传递给它。一旦线程完成了服务,它会返回到池中再等待工作。如果池内没有可用线程,那么服务器会等待,直到有空线程为止。

    线程池的优势?
    总体来说,线程池有如下的优势:
    (1)降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
    (2)提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
    (3)提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。

    java中如何创建线程池?
    java封装好了4种常见的功能线程池:

    • 定长线程池(FixedThreadPool)特点:只有核心线程,线程数量固定,执行完立即回收,任务队列为链表结构的有界队列。应用场景:控制线程最大并发数。
    • 定时线程池(ScheduledThreadPool )特点:核心线程数量固定,非核心线程数量无限,执行完闲置10ms后回收,任务队列为延时阻塞队列。应用场景:执行定时或周期性的任务。
    • 可缓存线程池(CachedThreadPool)特点:无核心线程,非核心线程数量无限,执行完闲置60s后回收,任务队列为不存储元素的阻塞队列。应用场景:执行大量、耗时少的任务。
    • 单线程化线程池(SingleThreadExecutor)特点:只有1个核心线程,无非核心线程,执行完立即回收,任务队列为链表结构的有界队列。应用场景:不适合并发但可能引起IO阻塞性及影响UI线程响应的操作,如数据库操作、文件操作等。

    2020-8-20 线程池 - 图1
    参考链接:java多线程