线程池放在局部和成员的区别

本文探讨了线程池在不同场景下可能引发的内存泄露问题,包括线程池作为局部变量和成员变量时的注意事项,以及如何通过设置核心线程超时时间和主动调用shutdown方法来避免内存泄露。

1.线程池释放的情况

有核心线程数的线程池,线程池是不会主动释放的,除非线程全都死掉了,线程池才随之释放

 

2.线程池作为局部变量

在调用该方法的时候就会频繁的创建线程池的实例,如果在没有手动调用shutdown方法的情况下会导致内存泄露。如果非要放在局部不可,需要对核心线程设置超时时间并且主动调用shutdown关闭线程池

 

3.线程池作为成员变量

这要分两种情况:

(1)如果宿主对象需要被频繁的创建对象,也就是多例,那么即使线程池放在成员,也会导致存在很多的线程池实例,导致内存泄露。

(2)在springmvc中就不会有这样的情况,因为被spring管理的类都是单例的,那么成员处的线程池使用静态修饰后,内存中只存在一个实例

 

.版本 2 .支持库 iext .支持库 EThread .程序集 窗口程序集_启动窗口 .程序集变量 许可证, 线程许可证 .程序集变量 结果文件号, 整数型 .程序集变量 线程数, 整数型 .程序集变量 停止标志, 逻辑型 .程序集变量 目录队列, 文本型, , "0" .程序集变量 最大线程数, 整数型 .程序集变量 队列许可证, 线程许可证 .程序集变量 文件写入锁, 线程许可证 .程序集变量 UI更新许可证, 线程许可证, , , ; 新增UI更新锁 .程序集变量 文件路径, 文本型 .程序集变量 工作线程数, 整数型 .子程序 __启动窗口_创建完毕 花名花见.皮肤加载 (6, , , , , ) 通用对话框_保存.初始目录 = 编辑框_目录.内容 最大线程数 = 4 ' 根据CPU核心数设置合适值 清除数组 (目录队列) ' 初始化目录队列 许可证 = 线程_创建许可证 () 队列许可证 = 线程_创建许可证 () 文件写入锁 = 线程_创建许可证 () UI更新许可证 = 线程_创建许可证 () ' 创建UI更新锁 结果文件号 = 打开文件 (“文件列表.txt”, #重写, ) 关闭文件 (结果文件号) 停止标志 = 假 编辑框_目录.内容 = 到文本 (读入文件 (取运行目录 () + “\地址.ini”)) 超级列表框_数据显示.始终显示选择项 = 真 最大线程数 = 5 ' 初始化线程池 .计次循环首 (最大线程数, ) 启动线程 (&目录扫描线程, , ) .计次循环尾 () .子程序 _按钮_查找文件_被单击 .局部变量 初始目录, 文本型 .局部变量 文本, 文本型 文本 = 文本_删除空行 (编辑框_过滤器.内容) .如果真 (文本 = “”) 信息框 (“未输入需要查找的文件名!”, 0, , ) 返回 () .如果真结束 ' 在主线程直接更新UI 标签_搜索完成.文本颜色 = #红色 标签_搜索完成.标题 = “文件枚举中,请稍等》》》》” 列表框1.清空 () 初始目录 = 编辑框_目录.内容 .如果真 (目录_是否存在 (初始目录) = 假) 信息框 (“目录不存在!”, 0, , ) 返回 () .如果真结束 停止标志 = 假 列表框1.清空 () ' 初始化目录队列 清除数组 (目录队列) 加入成员 (目录队列, 初始目录) ' 启动多个工作线程 .计次循环首 (最大线程数, ) 启动线程 (&目录扫描线程, , ) .计次循环尾 () .子程序 目录扫描线程 .局部变量 文件数组, 文本型, , "0" .局部变量 子目录数组, 文本型, , "0" .局部变量 当前目录, 文本型 .局部变量 i, 整数型 .局部变量 缓存路径, 文本型 .局部变量 tmp_count, 整数型 .局部变量 tmp_workers, 整数型 .判断循环首 (取反 (停止标志)) 线程_进入许可区 (许可证) .如果 (取数组成员数 (目录队列) > 0) 当前目录 = 目录队列 [1] 删除成员 (目录队列, 1, 1) 工作线程数 = 工作线程数 + 1 .否则 当前目录 = “” .如果结束 线程_退出许可区 (许可证) .如果真 (当前目录 = “”) 程序_延时 (100) 到循环尾 () .如果真结束 文件_枚举 (当前目录, 编辑框_过滤器.内容 + “.txt”, 文件数组, 真, 假, 真) 缓存路径 = “” ' 初始化缓存 .计次循环首 (取数组成员数 (文件数组), i) .如果真 (停止标志) 跳出循环 () .如果真结束 缓存路径 = 缓存路径 + 文件数组 [i] + #换行符 线程_进入许可区 (UI更新许可证) ' 添加UI锁 列表框1.加入项目 (文件数组 [i], ) 线程_退出许可区 (UI更新许可证) .计次循环尾 () .如果真 (缓存路径 ≠ “”) 保存结果 (缓存路径) ' 批量写入 .如果真结束 目录_枚举子目录 (当前目录, 子目录数组, 假) 线程_进入许可区 (许可证) .计次循环首 (取数组成员数 (子目录数组), i) 加入成员 (目录队列, 子目录数组 [i]) .计次循环尾 () 工作线程数 = 工作线程数 - 1 tmp_count = 取数组成员数 (目录队列) tmp_workers = 工作线程数 线程_退出许可区 (许可证) ' 安全更新UI 线程_进入许可区 (UI更新许可证) .如果 (tmp_count = 0 且 tmp_workers = 0) 标签_搜索完成.文本颜色 = #绿色 标签_搜索完成.标题 = “扫描完成!” .否则 标签_搜索完成.标题 = “正在扫描,剩余目录:” + 到文本 (tmp_count) .如果结束 线程_退出许可区 (UI更新许可证) .判断循环尾 () .子程序 保存结果 .参数 内容, 文本型 线程_进入许可区 (文件写入锁) 结果文件号 = 打开文件 (“文件列表.txt”, #改写, ) ' 改为改写模式 移到文件尾 (结果文件号) 写出文本 (结果文件号, 内容) 关闭文件 (结果文件号) 线程_退出许可区 (文件写入锁) .子程序 _按钮_停止_被单击 停止标志 = 真 .子程序 __启动窗口_将被销毁 停止标志 = 真 .判断循环首 (线程数 > 0) ' 等待所有线程退出 程序_延时 (100) .判断循环尾 () 线程_删除许可证 (许可证) 写到文件 (取运行目录 () + “\地址.ini”, 到字节集 (编辑框_目录.内容)) .子程序 _编辑框_过滤器_放开某键, 逻辑型 .参数 键代码, 整数型 .参数 功能键状态, 整数型 .如果真 (键代码 = #回车键) _按钮_查找文件_被单击 () .如果真结束 .子程序 _列表框1_列表项被选择 .局部变量 文件内容, 文本型 .局部变量 文件号, 整数型 .局部变量 行数组, 文本型, , "0" .局部变量 列数组, 文本型, , "0" .局部变量 i, 整数型 .局部变量 j, 整数型 .局部变量 A, 整数型 超级列表框_数据显示.全部删除 () ' 确定需要加入的位置 文件路径 = 列表框1.取项目文本 (列表框1.现行选中项) ' 关键修复:更新全局路径 文件号 = 打开文件 (文件路径, , ) 文件内容 = 读入文本 (文件号, ) 列数组 = 分割文本 (文件内容, #换行符, ) 关闭文件 (文件号) ' 导入每列数据 .计次循环首 (取数组成员数 (列数组), i) A = 超级列表框_数据显示.插入表项 (, 到文本 (超级列表框_数据显示.取表项数 () + 1), , , , ) ' 应在循环内对每一行列进行分割 .如果真 (取文本长度 (列数组 [i]) > 0) 行数组 = 分割文本 (列数组 [i], “|”, ) ' ? 每行独立分割 .计次循环首 (取数组成员数 (行数组), j) 超级列表框_数据显示.置标题 (A, j, 行数组 [j]) .计次循环尾 () .如果真结束 .计次循环尾 () .子程序 _超级列表框_数据显示_被双击, 逻辑型 .参数 横向位置, 整数型 .参数 纵向位置, 整数型 .参数 功能键状态, 整数型 .局部变量 行索引, 整数型 .局部变量 客户名称, 文本型 .局部变量 颜色, 文本型 .局部变量 数量, 文本型 .局部变量 电压, 文本型 .局部变量 电流, 文本型 .局部变量 老化, 文本型 .局部变量 全检, 文本型 .局部变量 备注, 文本型 ' 获取当前被双击的行索引(从1开始) 行索引 = 超级列表框_数据显示.现行选中项 .如果真 (行索引 ≠ -1) ' 获取该行第一列的内容(可根据需要改为其他列) 客户名称 = 超级列表框_数据显示.取标题 (行索引, 1) 颜色 = 超级列表框_数据显示.取标题 (行索引, 2) 数量 = 超级列表框_数据显示.取标题 (行索引, 3) 电压 = 超级列表框_数据显示.取标题 (行索引, 4) 电流 = 超级列表框_数据显示.取标题 (行索引, 5) 老化 = 超级列表框_数据显示.取标题 (行索引, 6) 全检 = 超级列表框_数据显示.取标题 (行索引, 7) 备注 = 超级列表框_数据显示.取标题 (行索引, 8) 编辑框_客户名称.内容 = 客户名称 编辑框_颜色.内容 = 颜色 编辑框_数量.内容 = 数量 编辑框_电流.内容 = 电流 .判断开始 (老化 = “是”) 组合框_老化.现行选中项 = 0 .判断 (老化 = “否”) 组合框_老化.现行选中项 = 1 .默认 .判断结束 .判断开始 (电压 = “24”) 组合框_电压.现行选中项 = 0 .判断 (电压 = “12”) 组合框_电压.现行选中项 = 1 .判断 (电压 = “48”) 组合框_电压.现行选中项 = 2 .判断 (电压 = “5”) 组合框_电压.现行选中项 = 3 .判断 (电压 = “ 3”) 组合框_电压.现行选中项 = 4 .默认 .判断结束 .判断开始 (全检 = “否”) 组合框_全检.现行选中项 = 0 .判断 (全检 = “是”) 组合框_全检.现行选中项 = 1 .默认 .判断结束 编辑框_备注.内容 = 备注 .如果真结束 .子程序 _按钮_加入数据_被单击 .局部变量 a, 整数型 超级列表框_数据显示.置标题 (a, 4, 电压值) ' 在最后一行插入新的条目 .如果 (编辑框_客户名称.内容 ≠ “” 且 编辑框_颜色.内容 ≠ “” 且 编辑框_数量.内容 ≠ “” 且 编辑框_电流.内容 ≠ “”) a = 超级列表框_数据显示.插入表项 (, 到文本 (超级列表框_数据显示.取表项数 () + 1), , , , ) 超级列表框_数据显示.置标题 (a, 1, 文本_删首尾空 (编辑框_客户名称.内容)) 超级列表框_数据显示.置标题 (a, 2, 文本_删首尾空 (到大写 (编辑框_颜色.内容))) 超级列表框_数据显示.置标题 (a, 3, 文本_删首尾空 (编辑框_数量.内容)) .判断开始 (组合框_电压.现行选中项 = 0) 超级列表框_数据显示.置标题 (a, 4, “24”) .判断 (组合框_电压.现行选中项 = 0) 超级列表框_数据显示.置标题 (a, 4, “12”) .判断 (组合框_电压.现行选中项 = 0) 超级列表框_数据显示.置标题 (a, 4, “48”) .判断 (组合框_电压.现行选中项 = 0) 超级列表框_数据显示.置标题 (a, 4, “5”) .判断 (组合框_电压.现行选中项 = 0) 超级列表框_数据显示.置标题 (a, 4, “3”) .默认 .判断结束 超级列表框_数据显示.置标题 (a, 5, 文本_删首尾空 (编辑框_电流.内容)) .判断开始 (组合框_老化.现行选中项 = 0) 超级列表框_数据显示.置标题 (a, 6, “是”) .默认 组合框_老化.现行选中项 = 1 超级列表框_数据显示.置标题 (a, 6, “否”) .判断结束 .判断开始 (组合框_全检.现行选中项 = 0) 超级列表框_数据显示.置标题 (a, 7, “否”) .默认 组合框_老化.现行选中项 = 1 超级列表框_数据显示.置标题 (a, 7, “是”) .判断结束 超级列表框_数据显示.置标题 (a, 8, 文本_删首尾空 (编辑框_备注.内容)) 超级列表框_数据显示.置标题 (a, 9, 到文本 (取年份 (取现行时间 ())) + “年” + 到文本 (取月份 (取现行时间 ())) + “月” + 到文本 (取日 (取现行时间 ())) + “日”) .否则 信息框 (“输入错误!”, 0, , ) .如果结束 编辑框_客户名称.内容 = “” 编辑框_备注.内容 = “” .子程序 _按钮_删除文件_被单击 .局部变量 行索引, 整数型 .局部变量 被选中的行数组, 整数型, , "0" 被选中的行数组 = 超级列表框_数据显示.取被选择表项 () .如果真 (取数组成员数 (被选中的行数组) > 0) 行索引 = 被选中的行数组 [1] ' 获取第一个被选中的行索引 超级列表框_数据显示.删除表项 (行索引) .如果真结束 .子程序 _按钮_保存文件_被单击 .局部变量 保存到的路径, 文本型 .局部变量 对话框结果, 逻辑型 .如果真 (超级列表框_数据显示.取表项数 () = 0) 信息框 (“没有需要保存的内容!”, 0, , ) 返回 () .如果真结束 ' 若当前已有文件路径,则提取目录部分作为初始目录 .如果真 (取反 (文件路径 = “”)) 保存到的路径 = 文本_取左边 (文件路径, “\”, -1, ) 通用对话框_保存.初始目录 = 保存到的路径 通用对话框_保存.文件名 = 编辑框_过滤器.内容 .如果真结束 ' 设置保存对话框属性 通用对话框_保存.类型 = 1 ' 1 表示保存文件 通用对话框_保存.过滤器 = “文本文件(*.txt)|*.txt” ' 通用对话框_保存.默认扩展名 = “txt” ' 显示对话框 对话框结果 = 通用对话框_保存.打开 () .如果真 (对话框结果) ' 用户点击“保存”后执行保存操作 文件路径 = 通用对话框_保存.文件名 ' 更新全局路径 超级列表框_保存到文件 (文件路径, 假) ' 假:覆盖写入 ' 信息框 (“文件已成功保存!”, 0, , ) .如果真结束 .子程序 超级列表框_保存到文件 .参数 目标路径, 文本型 .参数 是否追加, 逻辑型 .局部变量 文件号, 整数型 .局部变量 行索引, 整数型 .局部变量 列索引, 整数型 .局部变量 当前行文本, 文本型 ' 打开文件(追加或新建) .如果 (是否追加) 文件号 = 打开文件 (目标路径, #改写, ) ' 覆盖模式 .否则 文件号 = 打开文件 (目标路径, #重写, ) ' 创建模式 .如果结束 .如果真 (文件号 = 0) 信息框 (“文件创建失败!”, 0, , ) 返回 () .如果真结束 ' 写入数据行 .计次循环首 (超级列表框_数据显示.取表项数 (), 行索引) 当前行文本 = “” .计次循环首 (超级列表框_数据显示.取列数 (), 列索引) 当前行文本 = 当前行文本 + 超级列表框_数据显示.取标题 (行索引 - 1, 列索引) + “|” .计次循环尾 () 写文本行 (文件号, 当前行文本) .计次循环尾 () 关闭文件 (文件号)
最新发布
11-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值