资讯专栏INFORMATION COLUMN

多线程学习笔记(3):线程池

Blackjun / 1850人阅读

摘要:线程池维护线程所允许的空闲时间的单位线程池所使用的缓冲队列一般采用阻塞队列,有很多种无界阻塞队列有界阻塞队列同步移交队列线程池对拒绝任务的处理策略丢弃任务并抛出异常。

一、线程池的概念

“池”,就是一个工厂,会提前生产出一些东西供使用。所以线程池就是处理多线程的一种方式。
其作用就在于:复用已有资源,控制资源总量

二、为什么使用线程池

如果不使用线程池,那么:
(1)使用单线程,但是这种方式吞吐量非常低,且请求量一大效率就会显得非常低。
(2)那如果对于每个请求都开一个线程去处理,这样一旦请求量过大的时候,线程的创建和销毁都要花费时间,并且线程本身也要占用一定的内存。

使用线程池后,既可以解决单线程低吞吐量和响应慢的问题,又解决了为每一个请求创建线程所耗费的资源问题。

线程池通过限制线程的数量,可以使线程数维持在一个合理的数量,充分发挥了CPU的作用。

而且,线程池遵循了生产者消费者模式,将任务的创建和执行解耦

三、ThreadPoolExecutor
public class ThreadPoolExecutor extends AbstractExecutorService {
    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,TimeUnit unit,
                              BlockingQueue workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler);
}

这里是ThreadPoolExecutor最重要的一个构造方法
(1)corePoolSize : 线程池中维护线程的最少数量
当线程数少于corePoolSize时,就创建一条新的任务,不管是否有空闲的线程。

(2)maximumPoolSize: 线程池中维护线程的最大数量
当线程数到达corePoolSize,并且都不空闲,那么新任务都放到任务队列中去。当任务队列放满之后,如果线程数小于maximumPoolSize,就继续创建新线程。

(3)keepAliveTime:线程池维护线程所允许的空闲时间
如果线程空闲的时间超过keepAliveTime,那么就撤销它。

(4)unit: 线程池维护线程所允许的空闲时间的单位

(5)workQueue: 线程池所使用的缓冲队列
一般采用阻塞队列,有很多种:
无界阻塞队列、有界阻塞队列、同步移交队列

(6)handler: 线程池对拒绝任务的处理策略
AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
DiscardPolicy:也是丢弃任务,但是不抛出异常。
DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
CallerRunsPolicy:由调用线程处理该任务

四、四种线程池

1、CachedThreadPool
先查看有没有可用的线程,没有再创建新线程

2、FixedThreadPool
与上一种差不多,但是不允许随时创建新线程
任意时间点,最多只能有固定数目的活动线程存在,此时如果有新的线程要建立,只能放在另外的队列中等待,直到当前的线程中某个线程终止直接被移出池子。

3、ScheduledThreadPool
这个池子里的线程可以按 schedule 依次 delay 执行,或周期执行

4、SingleThreadExecutor
任意时间内池子里只能有一个线程。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75237.html

相关文章

  • linux IO学习笔记 (持续更新错误)

    摘要:以下详细分开记笔记三多线程模型线程的三种状态,使命等待事件任务特点始终只有一个状态等待。确定某个成为后,自身转变为处理任务。子线程处理完任务后,会退出线程并销毁资源。 linux 学习笔记 一、linux的缓存IO机制 从权限上来说,内核拥有权限很高,可访问所有底层硬件。而用户(进程)的权限相对较低,而这样的目的便是为了保护内核的安全。从内存空间上来说,操作系统把内存分成了两份,一份给...

    Elle 评论0 收藏0
  • 并发学习笔记 (6)

    摘要:每个通过网络到达服务器的连接都被包装成一个任务并且传递给线程池。线程池的线程会并发的处理连接上的请求。用线程池控制线程数量,其他线程排队等候。实现包,线程池顶级接口是但是严格意义讲并不是一个线程。此线程池支持定时以及周期性执行任务的需求。 tutorial site1tutorial site2 一个问题: 每启动一个新线程都会有相应的性能开销(涉及到OS的交互:创建线程,销毁线程...

    superw 评论0 收藏0
  • Python

    摘要:最近看前端都展开了几场而我大知乎最热语言还没有相关。有关书籍的介绍,大部分截取自是官方介绍。但从开始,标准库为我们提供了模块,它提供了和两个类,实现了对和的进一步抽象,对编写线程池进程池提供了直接的支持。 《流畅的python》阅读笔记 《流畅的python》是一本适合python进阶的书, 里面介绍的基本都是高级的python用法. 对于初学python的人来说, 基础大概也就够用了...

    dailybird 评论0 收藏0
  • 《深入理解java虚拟机》学习笔记系列——java内存区域划分

    摘要:运行时数据区域的学习,是学习以及机制的基础,也是深入理解对象创建及运行过程的前提。了解内存区域划分,是学习概念的前提。 Java 运行时数据区域的学习,是学习 jvm 以及 GC 机制的基础,也是深入理解 java 对象创建及运行过程的前提。废话不多说,直接进入正题: 一张图总结 showImg(https://segmentfault.com/img/bVOMAn?w=685&h=5...

    史占广 评论0 收藏0
  • Java 并发学习笔记

    摘要:方法可以将当前线程放入等待集合中,并释放当前线程持有的锁。此后,该线程不会接收到的调度,并进入休眠状态。该线程会唤醒,并尝试恢复之前的状态。 并发 最近重新复习了一边并发的知识,发现自己之前对于并发的了解只是皮毛。这里总结以下Java并发需要掌握的点。 使用并发的一个重要原因是提高执行效率。由于I/O等情况阻塞,单个任务并不能充分利用CPU时间。所以在单处理器的机器上也应该使用并发。为...

    DrizzleX 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<