美文网首页
聊聊线程池

聊聊线程池

作者: Bardon_X | 来源:发表于2019-03-13 17:24 被阅读0次

线程池:指管理一组同构工作线程的资源池。线程池与工作队列(Work Queue)密切相关,其中在工作队列中保存了所有等待执行的任务。工作线程(Worker Thread)的任务很简单:从工作队列中获取一个任务,执行任务,然后返回线程池并等待下一个任务。

线程池的优势:通过重用现有线程而不是创建新线程,可以处理多个请求时分摊在线程创建和销毁过程中产生的巨大开销,另外任务到达,工作线程通常存在,提高了响应性。

通过Executors中静态工厂方法来创建一个线程池:

newFixedThreadPool,将创建一个固定长度的线程池,每提交一个任务就创建一个线程,直到达到线程池的最大数量。如果发生未预期的异常,线程池还会补充一个新线程。

newCachedThreadPool,将创建一个可缓存的线程池,如果线程池的当前规模超过处理需求,那么将回收空闲线程,当需求增加,可添加新线程。

newSingleThreadExecutor,是一个单线程的Executor,它将创建单个工作线程来执行任务,如果这个线程异常结束,会创建另外一个替代,该线程可确保依照任务队列中的顺序串行执行

newScheduledThreadPool,创建一个固定长度的线程池,而且以延迟或定时的方式来执行任务。

ExecutorService的生命周期有3种状态:运行、关闭和已终止。shutdow方法将执行平缓的关闭过程,即不再接受新的任务,同时等待已经提交的任务完成。shutdowNowd方法将执行粗暴的关闭过程,尝试取消所有运行中的任务,并且不再启动队列中尚未开始执行的任务。ExecutorService关闭后提交的任务将由“拒绝执行处理器”来处理,抛弃任务或使得execute方法抛出一个未检出的RejectedExecutionException,最后ExecutorServie进入终止状态。

携带结果的任务Callable与Future

饱和策略:当有界队列被填满后,饱和策略开始发挥作用。ThreadPoolExecutor的饱和策略可以通过调用setRejectedExecutionHandler来修改。

AbortPolicy:终止,是默认的饱和策略,该策略会抛出RejectedExecutionException。

DiscardPolicy:当新提交的任务无法保存到队列中,该策略会抛弃该任务。

DiscardOldestPolicy:会抛弃下一个将被执行的任务,然后尝试提交新任务(优先级队列与该策略最好不同时使用)。

CallerRunsPolicy:该策略不会抛弃任务,也不会抛出异常,而是将某些任务回退给调用者,从而降低新任务的流量。

以WebService为例,使用有界队列和CallerRunPolicy时,当线程池所有线程都被占用,工作队列被填满,下一个任务会在调用execute的主线程中执行。这期间,主线程不会调用accept,因此请求将被保存到TCP层的队列,如果持续过载,TCP层请求队列被填满,开始抛弃请求,导致服务期在高负载下实现一种平缓的性能降低。

参考:

《Java并发编程实战》

相关文章

  • 聊聊线程池

    线程池:指管理一组同构工作线程的资源池。线程池与工作队列(Work Queue)密切相关,其中在工作队列中保存了所...

  • 聊聊Java线程池原理

    线程池是很常用的并发框架,几乎所有需要异步和并发处理任务的程序都可用到线程池。使用线程池的好处如下: 降低资源消耗...

  • java线程池

    线程VS线程池 普通线程使用 创建线程池 执行任务 执行完毕,释放线程对象 线程池 创建线程池 拿线程池线程去执行...

  • java----线程池

    什么是线程池 为什么要使用线程池 线程池的处理逻辑 如何使用线程池 如何合理配置线程池的大小 结语 什么是线程池 ...

  • 简体字、冯|聊聊 fork-join框架

    title: 2018-8-3 聊聊 fork-join框架tags: java,并发,线程池grammar_cj...

  • 漫画:聊聊线程池中,线程的增长/回收策略

    一、序 我们今天就来借这个问题,聊聊线程池中维护的线程,它增长和回收的策略是什么样的? 二、线程池的策略 2.1 ...

  • Java线程池的使用

    线程类型: 固定线程 cached线程 定时线程 固定线程池使用 cache线程池使用 定时调度线程池使用

  • Spring Boot之ThreadPoolTaskExecut

    初始化线程池 corePoolSize 线程池维护线程的最少数量keepAliveSeconds 线程池维护线程...

  • 线程池

    1.线程池简介 1.1 线程池的概念 线程池就是首先创建一些线程,它们的集合称为线程池。使用线程池可以很好地提高性...

  • 多线程juc线程池

    java_basic juc线程池 创建线程池 handler是线程池拒绝策略 排队策略 线程池状态 RUNNIN...

网友评论

      本文标题:聊聊线程池

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