小工具      在线工具  汉语词典  css  js  c++  java

ThreadPoolExecutor的LinkedBlockingQueue 大小设置为10000,会溢出吗?

Java 额外说明

收录于:43天前

1、如果ThreadPoolExecutor的LinkedBlockingQueue大小设置为10000(下面声明),会不会溢出?

私有最终 ExecutorService es = new ThreadPoolExecutor(8, 10, 100, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(10000));

答:不。

2.先说BlockingQueue。如果BlockQueue为空,则从BlockingQueue取东西的操作会被阻塞,进入等待状态。直到有东西进入BlockingQueue后才会被唤醒。类似地,如果 BlockingQueue 已满,则任何从 BlockingQueue 获取内容的尝试都将被阻止。存东西的操作也会被阻塞,进入等待状态。直到BlockingQueue有空间时才会被唤醒继续操作。

3、分析一下原因:

下面看一下ThreadPoolTask​​Executor的源码:

public class ThreadPoolTaskExecutor extends ExecutorConfigurationSupport
		implements AsyncListenableTaskExecutor, SchedulingTaskExecutor {

	private final Object poolSizeMonitor = new Object();

	private int corePoolSize = 1;

	private int maxPoolSize = Integer.MAX_VALUE;

	private int keepAliveSeconds = 60;

	private int queueCapacity = Integer.MAX_VALUE;

	private boolean allowCoreThreadTimeOut = false;

	private TaskDecorator taskDecorator;

	private ThreadPoolExecutor threadPoolExecutor;


	/**
	 * Note: This method exposes an {@link ExecutorService} to its base class
	 * but stores the actual {@link ThreadPoolExecutor} handle internally.
	 * Do not override this method for replacing the executor, rather just for
	 * decorating its {@code ExecutorService} handle or storing custom state.
	 */
	@Override
	protected ExecutorService initializeExecutor(
			ThreadFactory threadFactory, RejectedExecutionHandler rejectedExecutionHandler) {

		BlockingQueue<Runnable> queue = createQueue(this.queueCapacity);

		ThreadPoolExecutor executor;
		if (this.taskDecorator != null) {
			executor = new ThreadPoolExecutor(
					this.corePoolSize, this.maxPoolSize, this.keepAliveSeconds, TimeUnit.SECONDS,
					queue, threadFactory, rejectedExecutionHandler) {
				@Override
				public void execute(Runnable command) {
					super.execute(taskDecorator.decorate(command));
				}
			};
		}
		else {
			executor = new ThreadPoolExecutor(
					this.corePoolSize, this.maxPoolSize, this.keepAliveSeconds, TimeUnit.SECONDS,
					queue, threadFactory, rejectedExecutionHandler);

		}

		if (this.allowCoreThreadTimeOut) {
			executor.allowCoreThreadTimeOut(true);
		}

		this.threadPoolExecutor = executor;
		return executor;
	}

/**
	 * Set the capacity for the ThreadPoolExecutor's BlockingQueue.
	 * Default is {@code Integer.MAX_VALUE}.   
	 * <p>Any positive value will lead to a LinkedBlockingQueue instance;
	 * any other value will lead to a SynchronousQueue instance.
	 * @see java.util.concurrent.LinkedBlockingQueue
	 * @see java.util.concurrent.SynchronousQueue
	 */
	public void setQueueCapacity(int queueCapacity) {
		this.queueCapacity = queueCapacity;
	}

LinkedBlockingQueue 默认为 {@code Integer.MAX_VALUE}。

ThreadPoolTask​​Executor是Spring核心包中的,ThreadPoolExecutor是JDK中的JUC。 ThreadPoolTask​​Executor封装了ThreadPoolExecutor。

从上面源码可以看出,也就是说我们平时使用的Spring封装的异步线程类有一个默认的Integer.MAX_VALUE的LinkedBlockingQueue(即ThreadPoolExecutor的LinkedBlockingQueue设置为Integer.MAX_VALUE),我们每天都使用它。异步执行器日常正常使用! ! !

现在我们直接将ThreadPoolExecutor的LinkedBlockingQueue的大小设置为10000(比Integer.MAX_VALUE小很多),这样肯定不会造成内存溢出。

. . .

相关推荐

额外说明

vue-json-excel前端导出excel教程

vue-json-excel是一个专门为解决前端导出Excel而开发的一个组件库。 个人认为,导出在前端做,不是特别合适,最好是后端提供导出下载文件接口,如果后端确实不想提供接口,要让你做前端导出,那么不妨试试这个组件。 目录 一、安装依赖 二、引入配置

额外说明

开发中常用性能指标总结

TPS TPS Transactions Per Second,也就是事务数/秒。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。 QPS QPS

额外说明

Redis5.0.x集群搭建

前言: 本文将介绍Redis5.0三主三从集群搭建以及集群配置。 一.资源配置(3主3从集群) 1.以下为生产环境下,集群搭建所需资源配置: 资源 配置 cpu 4核*6 内存 16G*6 硬盘 20G *6 linux版本 CentOS 7.5 64b

额外说明

深入探究基于发布/订阅模式的轻量级消息传输协议 MQTT

目录 1、什么是 MQTT? 1.1、MQTT 与 HTTP 比较 1.2、 MQTT 与 XMPP 比较 2、MQTT 可以干啥? 3、 MQTT 协议特性详解 3.1、轻量高效,节省带宽 3.2、可靠的消息传递 3.3、海量连接支持 3.4、安全的双

额外说明

从可变参数函数的调用引发异常崩溃一例引发的一些思考

VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新.

额外说明

CTFHub -- 信息泄露-备份文件下载

CTFHub -- 信息泄露-备份文件下载) 1.网站源码 2.bak文件 3.vim缓存 4. .DS_Store 1.网站源码 打开之后页面是这样。 思路:打开扫描工具扫目录 ps:这里它给出了常见文件,我为了练习最近学的python写个小脚本 代码

额外说明

【PHP面试题72】写出PHP链接MySQL实现增删改查的代码

文章目录 一、前言 二、步骤讲解 2.1 连接数据库 2.2 插入数据 2.3 查询数据 2.4 更新数据 2.4 删除数据 2.5 事务处理 2.6 结果集处理 2.7 异常处理 三、综合代码 四、总结 一、前言 本文已收录于PHP全栈系列专栏:PHP

额外说明

卸载WINDOWS服务的命令

如果你要卸载一个本地服务,可以打开CMD,C:/WINDOWS/system32>sc delete MyServiceName 

ads via 小工具