最近项目中为了提高用户体验度,前台创建任务后台任务,用多线程来跑。

现在的场景:后台定时任务管理这两个线程池,一个最大线程数10个,一个最大线程数15。应用部署之后,不超过5个小时,服务器负载高,内存使用过多。

分析原因:因为这个功能是excel导入功能,如果前台有大量的导入任务时,那么后台的负载就会很高。

我的实现原理:定时任务读取任务,放到任务队列表中,然后使用线程池消费任务队列中的任务,每个线程时一直循环取任务。

我的定时任务周期是 1 分钟,线程池从初始化时,空闲线程存活的时间为 1 分钟,任务队列没有设定最大数量值。

优化:

1.任务队列没有上限

定时任务每次启动都回去数据库中读取任务,放入对列表中,如果一直往任务队列中放,那么任务队列占用的内存会越来越大,导致服务器内存不足。

解决办法:定时任务在读取任务时,先判断任务队列的大小,比如我这设置的100个,那么我就不再读取新的任务了。这个参数需要通过观察机器的负载,然后来调整。

2.线程池中的线程,无限循环处理任务,当任务数量过多的时候,线程会一直执行,停不下来。

线程池中的线程,无限循环处理任务,当任务数量过多的时候,线程会一直执行,停不下来。

解决办法:在线程内部设置计数器,当一个线程累计到一定数量,退出循环,然后清空资源,回收,间歇性,周期的执行任务,相当于定期回收资源

3.定时任务 1 分钟,那么空闲线程存活的时间为1分钟

由于空闲线程存活时间是 1 分钟,那么我的定时任务也是 1 分钟,这个时候,线程就基本就不会被线程池回收,那么资源就一直没有释放,被回收。

解决办法:调整线程空闲的线程存活时间为定时任务周期的一半,也就是30秒。

4.在线程池中,有核心线程,对于核心线程超时也回收,所以,需要执行下边这个方法,确保核心线程超时之后也被回收。

解决办法:threadPoolExecutor.allowCoreThreadTimeOut(true);

优化之后的流程:

任务定期读取任务,往任务队列中放一定量(不能超过最大值)的任务,之后线程池中的线程超时时间设置短一点,线程通过计数器,当执行了一定数量的线程之后,推出循环,这个时候线程就空闲了,后边就会被线程池回收,资源被回收,如此反复进行下去,资源回收,重新分配,不会大量消耗服务资源。

通过以上几个点的优化,程序消耗服务器资源好很多,可能还有优化的地方,后边再补充。

java 线程池 资源回收_JAVA线程池资源回收的问题相关推荐

  1. java 线程回收_JAVA线程池资源回收的问题

    最近项目中为了提高用户体验度,前台创建任务后台任务,用多线程来跑. 现在的场景:后台定时任务管理这两个线程池,一个最大线程数10个,一个最大线程数15.应用部署之后,不超过5个小时,服务器负载高,内存 ...

  2. java线程池的应用_Java线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  3. java线程池存在时间_Java线程池基础

    目录: 一.线程池概述 1.线程池类 目前线程池类一般有两个,一个来自于Spring,一个来自于JDK: 来自Spring的线程池:org.springframework.scheduling.con ...

  4. java set和get原理_Java线程池的实现原理和使用

    为什么用线程池 在我们进行开发的时候,为了充分利用系统资源,我们通常会进行多线程开发,实现起来非常简单,需要使用线程的时候就去创建一个线程(继承Thread类.实现Runnable接口.使用Calla ...

  5. java线程池 的方法_JAVA线程池的实现方法

    我们大家都知道,在处理多线程服务并发时,由于创建线程需要占用很多的系统资源,所以为了避免这些不必要的损耗,通常我们采用线程池来解决这些问题. 线程池的基本原理是,首先创建并保持一定数量的线程,当需要使 ...

  6. java线程池的概念_Java线程池的基本概念以及生命周期

    一.为什么要实现线程池? 线程的创建与销毁对于CPU而言开销较大,通过池化技术可避免重复的创建与销毁线程. 方便与线程资源统一管理. 二.几种常见的线程池以及核心参数 不推荐使用Executor创建线 ...

  7. java 线程池 源码_java线程池源码分析

    我们在关闭线程池的时候会使用shutdown()和shutdownNow(),那么问题来了: 这两个方法又什么区别呢? 他们背后的原理是什么呢? 线程池中线程超过了coresize后会怎么操作呢? 为 ...

  8. java 线程池的理解_JAVA线程池原理的理解

    线程池原理基础理解: 线程池初始化规定个数的线程,然后这些线程一直运行,并且监控线程队列,只要线程队列被添加进线程,那么线程池不断从队列中取出线程运行.直到队列中的线程为空.实例代码如下: packa ...

  9. java线程池多线程优先级_Java线程优先级

    java线程池多线程优先级 Priority of a thread describes how early it gets execution and selected by the thread ...

最新文章

  1. java string底层实现_Java-学习日记(Shell与String底层原理)
  2. python读取word指定内容_python读取word 中指定位置的表格及表格数据
  3. jeecmsv9导入mysql详细步骤_jeecms v9.3数据库导入
  4. Linux学习笔记12——配置ftp、squid、Tomcat、Samba、MySQL主从
  5. android软键盘自动弹出,android安卓editText自动弹出软键盘(输入键盘)
  6. linux minimal版没有ip信息,如何配置linux网络信息,访问外网
  7. git 报错 Repository Not Found
  8. Android SurfaceFlinger vsync信号产生与分发
  9. python编译安装没有c扩展_pybind11—python C/C++扩展编译
  10. jQuery中点击按钮创建表格
  11. java web 登陆验证 弹窗_带你玩转JavaWeb开发之四 -如何用JS做登录注册页面校验
  12. 为promise增加abort功能
  13. 用VBA程序开发Excel工具
  14. Cordys BOP 4.3平台使用小经验—数据库连接管理、导出流程模型为XPDL
  15. Dos界面telnet命令的基本使用
  16. 学霸,顾名思义,就是成绩非常好
  17. Opera官网打不开 下载Opera最新版本的实际地址
  18. 一句话概括 java 动态代理
  19. 单缝孔径平面内移动_傅里叶变换解夫琅禾费衍射问题的几个例子_3
  20. android商城首页布局,Android使用分类型RecyclerView仿各大商城首页

热门文章

  1. css比较特殊选择器汇总(持续更新)
  2. oracle 实现ID自增
  3. Nginx 的线程池与性能剖析【转载】
  4. Linux系统中的load average
  5. 微信接口开发-初级体验
  6. 数据库高级知识——查询截取分析(二)
  7. 【剑指offer】面试题55 - II:平衡二叉树(Java)
  8. ajax官方api,yangguozhong
  9. C语言bound函数,C/C++-STL中lower_bound与upper_bound的用法以及cmp函数
  10. mysql的exp平方_MySQL EXP()用法及代码示例