线程池队列区别

线程池的三种队列区别:SynchronousQueue、LinkedBlockingQueue 和ArrayBlockingQueue

https://blog.csdn.net/qq_26881739/article/details/80983495

1.SynchronousQueue(CachedThreadPool) 类似交警只是指挥车辆,并不管理车辆
SynchronousQueue没有容量,是无缓冲等待队列,是一个不存储元素的阻塞队列,会直接将任务交给消费者,必须等队列中的添加元素被消费后才能继续添加新的元素。
超出直接corePoolSize个任务,直接创建新的线程来执行任务,直到(corePoolSize+新建线程)> maximumPoolSize。不是核心线程就是新建线程。

2.LinkedBlockingQueue(single,fixed)类似小仓库,暂时存储任务,待系统有空的时候再取出执行
BlockingQueue是双缓冲队列。BlockingQueue内部使用两条队列,允许两个线程同时向队列一个存储,一个取出操作。在保证并发安全的同时,提高了队列的存取效率。
LinkedBlockingQueue是一个无界缓存等待队列。当前执行的线程数量达到corePoolSize的数量时,剩余的元素会在阻塞队列里等待。(所以在使用此阻塞队列时maximumPoolSizes就相当于无效了),每个线程完全独立于其他线程。生产者和消费者使用独立的锁来控制数据的同步,即在高并发的情况下可以并行操作队列中的数据。

3.ArrayBlockingQueue
ArrayBlockingQueue是一个有界缓存等待队列,可以指定缓存队列的大小,当正在执行的线程数等于corePoolSize时,多余的元素缓存在ArrayBlockingQueue队列中等待有空闲的线程时继续执行,当ArrayBlockingQueue已满时,加入ArrayBlockingQueue失败,会开启新的线程去执行,当线程数已经达到最大的maximumPoolSizes时,再有新的元素尝试加入ArrayBlockingQueue时会报错

原文地址:https://www.cnblogs.com/yslu/p/11629423.html

时间: 2024-11-13 15:49:55

线程池队列区别的相关文章

javaWeb 使用线程池+队列解决"订单并发"问题

解决方式:使用线程池+队列 项目基于Spring,如果不用spring需要自己把 ThreadPoolManager.java 改成单例模式 1.写一个Controller(Spring mvc) /** * @author HeyS1 * @date 2016/12/1 * @description */ @Controller public class ThreadPoolController { @Autowired ThreadPoolManager tpm; @RequestMappi

线程池队列饱和策略

1.当一个有限队列充满后,线程池的饱和策略开始起作用. 2.ThreadPoolExecutor的饱和策略通过调用setRejectedExecutionHandler来修改.不同的饱和策略如下: 1)AbortPolicy:中止,executor抛出未检查RejectedExecutionException,调用者捕获这个异常,然后自己编写能满足自己需求的处理代码. 2)DiscardRunsPolicy:遗弃最旧的,选择丢弃的任务,是本应接下来就执行的任务. 3)DiscardPolicy:

mysql线程池

http://mysql.taobao.org/monthly/2016/02/09/ 概述 MySQL 原有线程调度方式有每个连接一个线程(one-thread-per-connection)和所有连接一个线程(no-threads). no-threads一般用于调试,生产环境一般用one-thread-per-connection方式.one-thread-per-connection 适合于低并发长连接的环境,而在高并发或大量短连接环境下,大量创建和销毁线程,以及线程上下文切换,会严重影

Android线程管理之ThreadPoolExecutor自定义线程池(三)

前言: 上篇主要介绍了使用线程池的好处以及ExecutorService接口,然后学习了通过Executors工厂类生成满足不同需求的简单线程池,但是有时候我们需要相对复杂的线程池的时候就需要我们自己来自定义一个线程池,今天来学习一下ThreadPoolExecutor,然后结合使用场景定义一个按照线程优先级来执行的任务的线程池. ThreadPoolExecutor ThreadPoolExecutor线程池用于管理线程任务队列.若干个线程. 1.)ThreadPoolExecutor构造函数

AsyncTask中线程池调度分析

尊重原创:http://blog.csdn.net/yuanzeyao/article/details/42583215 在Android中,和异步执行相关的两个类就是Handler和AsyncTask,所以Android开发人员对于这两个类是再熟悉不过了,所以这里我不是讲解AsyncTask怎么使用,而是想分析一下AsyncTask中线程池的调度过程,然后简单的介绍一下AsyncTask的源码以及Android3.0前后,AsyncTask中线程池的区别. 在正式学习AsyncTask中的线程

线程池 API (转)

文档原始地址 目录 线程池概述 线程池对象 回调环境对象 工作对象 等待对象 计时器对象 I/O 完成对象 使用清理组简化清理 回调实例 API 随着 Windows Vista® 的发布和 Windows Server® 2008 的即将问世,Microsoft 为托管应用程序的开发人员提供了改进的 Windows® 平台,它包含多种新技术,使得令原本 Windows 开发人员从中受益的改进能被广为利用.例如,自从 Windows 2000 发布以来,已是该平台组成部分的线程池组件经历了一次完

Java 多线程(七)——线程组与线程池

1 线程组 1.1 概述 Java中使用ThreadGroup来表示线程组,它可以对一批线程进行分类管理.对线程组的控管理,即同时控制线程组里面的这一批线程. 用户创建的所有线程都属于指定线程组,如果没有显示指定属于哪个线程组,那么该线程就属于默认线程组(即main线程组).默认情况下,子线程和父线程处于同一个线程组. 只有在创建线程时才能指定其所在的线程组,线程运行中途不能改变它所属的线程组,也就是说线程一旦指定所在的线程组,就直到该线程结束. 线程组与线程之间结构类似于树形的结构: 1.2

Hystrix线程隔离技术解析-线程池(转)

认识Hystrix Hystrix是Netflix开源的一款容错框架,包含常用的容错方法:线程隔离.信号量隔离.降级策略.熔断技术. 在高并发访问下,系统所依赖的服务的稳定性对系统的影响非常大,依赖有很多不可控的因素,比如网络连接变慢,资源突然繁忙,暂时不可用,服务脱机等.我们要构建稳定.可靠的分布式系统,就必须要有这样一套容错方法. 本文主要讨论线程隔离技术. 为什么要做线程隔离 比如我们现在有3个业务调用分别是查询订单.查询商品.查询用户,且这三个业务请求都是依赖第三方服务-订单服务.商品服

JDK1.8中的线程池

上面这段代码一直在用,面试的时候也经常被问到,却从未深究过,不知道线程池到底是怎么回事,今天看看源代码,一探其究竟 线程池主要控制的状态是ctl,它是一个原子的整数,其包含两个概念字段: workerCount:有效的线程数量 runState:线程池的状态 为了在一个整型值里面包含这两个字段,我们限制workerCount最多2的29次方减1 runState的值有这样几种: RUNNING: 接受新的任务,并处理队列中的任务 SHUTDOWN:不接受新的任务,继续处理队列中的任务 STOP: