Java 线程池ExecutorService 等待队列问题

2023-11-03

本人博客原地址:Java 线程池ExecutorService 等待队列问题
创作时间: 2019.09.30 11:12:35

  • 1、首先看下Executor获取线程池,这样方式,可以设置线程池的大小,但是了解线程池的内部原理的情况下,这样的线程池可能会引起OOM,原因在于
    该线程池的等待队列最大长度默认为int的最大值,随口默写出来就是2147483647(2^31 -1,高中物理老师说过一句话,记住一些固定的数字可以预判一些问题)。线程池在提交任务时,如果线程池未达到最大线程数,则起线程执行任务,在达到最大值后,会放入等待队列,按默认的int最大值,很容易造成内存溢出。所以通常会选择自行构造线程池
ExecutorService threadPool = Executors.newFixedThreadPool(3);
  • 2、通过自行构建线程池,指定等待队列的长度。那么问题来了,虽然用的是BlockingQueue,但是往BlockingQueue放任务时,用的是offer(),方法,而不是阻塞的方法put();这样在队列满了之后,继续往队列放任务就会抛异常,线程池提供了rejection机制去处理这种情况,应用可以自定义如何处理队列满的情况,默认是直接丢弃。对于有些业务场景,我们宁愿阻塞等待,也不要无止境的放队列,然后让他失败。这时候需要再用一点奇技淫巧,用来保证在等待队列放置一定数量后,阻塞生成任务的线程,等到线程池里已经有任务处理完了再继续放入任务。
ExecutorService threadPool = new ThreadPoolExecutor(5, 5,
			0L, TimeUnit.MILLISECONDS,
			new ArrayBlockingQueue<Runnable>(5*2));
  • 3、还是使用2中自行构建的线程池,除此之外再定义一个blockQueue,最大长度为5,如下列代码。在while循环时,threadpool中的等待队列会逐渐增加最后稳定在5,并且此时与blockingQueue的长度一致,此时如果继续循环,便在blockingQueue.put(new Data())处阻塞,直到线程池中已有任务处理完。
BlockingQueue<Data> blockingQueue = new ArrayBlockingQueue<Data>(5);

    @Test
	public void testBlock() throws InterruptedException {
		int i=0;
		while(i<100){

			i++;
			blockingQueue.put(new Data());
//			System.out.println("blockingQueue.size():"+blockingQueue.size()+"  "+"threadpool:"+threadPool);
//			封装成task时并没有从blockingQueue中take,只有submit提交执行时才take,因此,等待队列中的task数目,就等于blockingQueue的长度了
			threadPool.submit( ()->{return process( blockingQueue.take());});
			System.out.println("blockingQueue.size():"+blockingQueue.size()+"  "+"threadpool:"+threadPool);
		}
		Thread.sleep(10000L);
		System.out.println("blockingQueue.size():"+blockingQueue.size()+"  "+"threadpool:"+threadPool);
	}


	public Result process(Data data) throws InterruptedException {
		Thread.sleep(300L);
		return new Result();
	}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 线程池ExecutorService 等待队列问题 的相关文章

随机推荐

  • 通配符*和?的区别

    通配符 和 的区别是 可以用来代替零个 单个或多个字符 而 仅可以使用代替一个字符 表示匹配的数量不受限制 而 的匹配字符数则受到限制
  • 17:UnicodeDecodeError: 'gbk' codec can't decode byte 0xff in position 0: illegal multibyte sequence

    菜鸟学python习题17运行错误 我的 直接在open里加了一个 errors ignore 即可 第一个人 使用python的时候经常会遇到文本的编码与解码问题 其中很常见的一种解码错误如题目所示 下面介绍该错误的解决方法 将 gbk
  • Rocketmq机制回顾总结

    1 应用场景如解耦 削峰填谷 异步处理 分布式事务中间协调 2 nameserver producer broker consumer 3 brokerName brokerId brokerRole Namesrvaddr常用配置参数 4
  • mysql查询语句group by 语句报错

    高版本的mysql 在查询语句时 有group by 会报错 报错信息如下 gt 1055 Expression 40 of SELECT list is not in GROUP BY clause and contains nonagg
  • [nifi] 数据管理分发工具

    官方文档 Apache NiFi 运行 HOME bin run nifi bat 打开网页 127 0 0 1 nifi 账号密码 HOME logs nifi app log 找到如下字段 开始界面 简单实例 1 本地 gt 本地 2
  • sqlplus,imp 等命令无效解决

    今天我在数据库上准备导入数据 但在输入sqlplus nolog 时报出 sqlplus 不是有效的内部命令 解决方案 在oracle ora92 bin 下找到了 sqlplus imp exp 等命令 点开可以执行 也可以在dos下进入
  • C# 算法系列 - 贪婪算法(背包问题)

    using System namespace ConsoleApp1 class Program static void Main string args 贪婪算法 背包问题 背包问题 Knapsack problem 是一种组合优化的NP
  • React 第七章 条件渲染

    根据条件渲染不同组件 可以实现组件的显示与隐藏 第一种 在函数内部通过属性props条件的判断 返回不同的组件 进行控制显示隐藏 如果返回null则表示不展示隐藏 1 条件渲染 function UserGreeting props ret
  • 银河麒麟软件源更新

    银河麒麟有用软件源 1 银河麒麟系统无法更新下载软件 原因是软件源失效 2 需要更换有效的软件源 3 修改软件源地址 在etc apt 的sources list文件里添加镜像源 deb http archive ubuntu com ub
  • js 在元素前后添加元素

    在元素前后添加创建的元素 话不多说 直接上代码 div div
  • axios上传formdata失败以及nodejs接受formdata失败

    axios上传formdata失败以及nodejs接受formdata失败 今天用nodejs写一个上传图片的功能 因为这个功能是用在vue中的 我首先在nodejs服务器上用jquery的ajax写好了这个功能 可是移植到vue中却出现了
  • 怎么查mac电脑是不是正品_mac电脑怎么投屏 教你选择适合自己的Mac投屏软件

    mac上有什么好的投屏软件嘛 苹果手机ios投屏到mac用哪款投屏软件 mac投屏ipad该用哪款软件怎么操作 macdown小编给大家介绍的这几款Mac投屏软件 各有各的特色 总有一款适合你投屏 1 AIrServer 7 for Mac
  • python人工智能,分类例解

    分类是一种常见的机器学习算法 是一种有监督的算法 简单说就是给出学习集数据都是带标签的 通过训练学习集数据获得模型 对未来给出的实际数据 根据模型进行分类 这里采用K最近邻算法 KNN K nearest neighbour KNN算法非常
  • 中国电子学会2023年05月份青少年软件编程C++等级考试试卷四级真题(含答案)

    1 怪盗基德的滑翔翼 怪盗基德是一个充满传奇色彩的怪盗 专门以珠宝为目标的超级盗窃犯 而他最为突出的地方 就是他每次都能逃脱中村警部的重重围堵 而这也很大程度上是多亏了他随身携带的便于操作的滑翔翼 有一天 怪盗基德像往常一样偷走了一颗珍贵的
  • FFmpeg的H264解码实战

    本文的内容是解码裸流 即从本地读取h264码流 然后解码成YUV像素数据的过程 1 FFmpeg视频解码流程 如上图所示是通过FFmpeg进行视频解码的流程 音视频流媒体高级开发 学习路线 www bilibili com video BV
  • flea-auth使用之角色子模块介绍

    角色子模块 本篇主要介绍笔者 授权模块 flea auth 下的角色子模块 1 总览 表名 中文描述 flea role 角色 flea role rel 角色关联 角色 权限 权限组 flea role group 角色组 不参与授权 f
  • SpringBoot简介及整合数据访问层

    目录 Springboot简介 parent starter 引导类 Springboot整合mybatis Springboot整合mybatis plus Springboot整合Druid Springboot整合Redis yml格
  • java 内存作用_【深入JVM】JAVA内存区域以及作用

    Java虚拟机所管理的内存将会包括以下几个运行时数据区域 所有线程共享的区域 Java堆 方法区 线程私有的 程序计数器 Java虚拟机栈 与对象内存分配关系最密切的内存区域是 堆内存 栈内存 虚拟机栈 虚拟机中内存最大的一块 java堆
  • 【链路聚合】Linux系统配置链路聚合详细步骤

    前言 链路聚合 英语 Link Aggregation 将多个物理端口汇聚在一起 形成一个逻辑端口 以实现出 入流量吞吐量在各成员端口的负荷分担 网卡的链路聚合就是将多块网卡连接起来 当一块网卡损坏 网络依旧可以正常运行 可以有效的防止因为
  • Java 线程池ExecutorService 等待队列问题

    本人博客原地址 Java 线程池ExecutorService 等待队列问题 创作时间 2019 09 30 11 12 35 1 首先看下Executor获取线程池 这样方式 可以设置线程池的大小 但是了解线程池的内部原理的情况下 这样的