From c2e9dc2a880d4b031e522ec5e3da956baf90c762 Mon Sep 17 00:00:00 2001 From: erdanergou Date: Mon, 8 May 2023 13:48:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=B3=BB=E7=BB=9F=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HandlesOtherFunctionalThreadPool.java | 18 +- .../pool/SendQyWxMessageThreadPool.java | 8 +- .../service/MaterialService.java | 18 -- .../service/impl/ExcelServiceImpl.java | 33 +-- .../service/impl/MaterialServiceImpl.java | 211 +----------------- .../depository_manage/OtherTest.java | 42 +++- 6 files changed, 81 insertions(+), 249 deletions(-) diff --git a/src/main/java/com/dreamchaser/depository_manage/security/pool/HandlesOtherFunctionalThreadPool.java b/src/main/java/com/dreamchaser/depository_manage/security/pool/HandlesOtherFunctionalThreadPool.java index 1378dc34..ea3b8ab6 100644 --- a/src/main/java/com/dreamchaser/depository_manage/security/pool/HandlesOtherFunctionalThreadPool.java +++ b/src/main/java/com/dreamchaser/depository_manage/security/pool/HandlesOtherFunctionalThreadPool.java @@ -1,21 +1,29 @@ package com.dreamchaser.depository_manage.security.pool; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.*; /** * 定义用于处理其他需要开启线程功能的线程池 */ public class HandlesOtherFunctionalThreadPool { - public static ExecutorService exs = new ThreadPoolExecutor(20, 10, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(10)); + + // 设置核心线程数为cpu的数量 + static int corePoolSize = Runtime.getRuntime().availableProcessors(); + // 设置最大线程数为cpu数的2倍 + static int maximumPoolSize = corePoolSize * 2; + static int keepAliveTime = 100; + + + public static ExecutorService exs = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, new LinkedBlockingQueue<>(),new ThreadPoolExecutor.CallerRunsPolicy()); // 用于执行对应的方法 public static void execute(Runnable runnable){ + exs.execute(runnable); + } + // 用于关闭线程池 public static void close(){ exs.shutdown(); // 禁止提交新任务 // 设定最大重试次数 diff --git a/src/main/java/com/dreamchaser/depository_manage/security/pool/SendQyWxMessageThreadPool.java b/src/main/java/com/dreamchaser/depository_manage/security/pool/SendQyWxMessageThreadPool.java index f8318eac..1e687cfe 100644 --- a/src/main/java/com/dreamchaser/depository_manage/security/pool/SendQyWxMessageThreadPool.java +++ b/src/main/java/com/dreamchaser/depository_manage/security/pool/SendQyWxMessageThreadPool.java @@ -6,7 +6,13 @@ import java.util.concurrent.*; * 定义用于发送企业微信相关信息的线程池 */ public class SendQyWxMessageThreadPool { - public static ExecutorService exs = new ThreadPoolExecutor(10, 10, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(10)); + // 设置核心线程数为cpu的数量 + static int corePoolSize = Runtime.getRuntime().availableProcessors(); + // 设置最大线程数为cpu数的2倍 + static int maximumPoolSize = corePoolSize * 2; + static int keepAliveTime = 100; + + public static ExecutorService exs = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, new LinkedBlockingQueue<>(),new ThreadPoolExecutor.CallerRunsPolicy()); // 用于执行对应的方法 public static void execute(Runnable runnable){ diff --git a/src/main/java/com/dreamchaser/depository_manage/service/MaterialService.java b/src/main/java/com/dreamchaser/depository_manage/service/MaterialService.java index 3d35d531..6f8a0a64 100644 --- a/src/main/java/com/dreamchaser/depository_manage/service/MaterialService.java +++ b/src/main/java/com/dreamchaser/depository_manage/service/MaterialService.java @@ -232,24 +232,6 @@ public interface MaterialService { */ Integer updateStateByTypeId(Map map); - /** - * 构造树形选择框(部门) - * @return - */ - List InitTreeMenus(String mname,String adminorg); - - /** - * 构造树形选择框(盘点) - * @return - */ - List InitTreeMenus(String mname,String depositoryId,String placeId); - - /** - * 构造树形选择框 - * @return - */ - List InitTreeMenus(String mname); - /** * 构造树形选择框(测试) * @return diff --git a/src/main/java/com/dreamchaser/depository_manage/service/impl/ExcelServiceImpl.java b/src/main/java/com/dreamchaser/depository_manage/service/impl/ExcelServiceImpl.java index 4d44885b..86045531 100644 --- a/src/main/java/com/dreamchaser/depository_manage/service/impl/ExcelServiceImpl.java +++ b/src/main/java/com/dreamchaser/depository_manage/service/impl/ExcelServiceImpl.java @@ -112,11 +112,17 @@ public class ExcelServiceImpl implements ExcelService { // 定义线程数 int threadSize = (int) Math.ceil(totalVal / size); + // 定义最大线程数 + int maxThreadSize = Runtime.getRuntime().availableProcessors(); + if (threadSize > maxThreadSize) { + double temp = threadSize - maxThreadSize; + maxThreadSize =(int)(Math.ceil(temp / maxThreadSize) * maxThreadSize); + } // 定义开启线程数目 int openThreadSize = 0; // 开启对应数量的线程 - ExecutorService exs = new ThreadPoolExecutor(threadSize, threadSize, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(threadSize)); + ExecutorService exs = new ThreadPoolExecutor(threadSize, maxThreadSize, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(maxThreadSize)); // 线程结果集 List>> futureList = new ArrayList>>(); @@ -161,7 +167,7 @@ public class ExcelServiceImpl implements ExcelService { } } List userExcelMaterialInfo = ExcelFileInfoPool.getUserExcelMaterialInfo(userByPort.getNumber()); - if(userExcelMaterialInfo == null){ + if (userExcelMaterialInfo == null) { userExcelMaterialInfo = new ArrayList<>(); } readResult.put("dataList", userExcelMaterialInfo); @@ -275,7 +281,7 @@ public class ExcelServiceImpl implements ExcelService { } List userExcelMaterialTypeInfo = ExcelFileInfoPool.getUserExcelMaterialTypeInfo(userByPort.getNumber()); - if(userExcelMaterialTypeInfo == null){ + if (userExcelMaterialTypeInfo == null) { userExcelMaterialTypeInfo = new ArrayList<>(); } @@ -394,7 +400,7 @@ public class ExcelServiceImpl implements ExcelService { List userExcelInventoryInfo = ExcelFileInfoPool.getUserExcelInventoryInfo(userByPort.getNumber()); - if(userExcelInventoryInfo == null){ + if (userExcelInventoryInfo == null) { userExcelInventoryInfo = new ArrayList<>(); } readResult.put("dataList", userExcelInventoryInfo); @@ -412,12 +418,11 @@ public class ExcelServiceImpl implements ExcelService { /** * 用于出库订单填充 * - * @param id 待打印出库订单id - - * @param pageSize 一张最多打印条数 + * @param id 待打印出库订单id + * @param pageSize 一张最多打印条数 */ @Override - public List writeExcelForPrint(Integer id, Integer pageSize,UserByPort userToken,String userKey,String token) { + public List writeExcelForPrint(Integer id, Integer pageSize, UserByPort userToken, String userKey, String token) { // 生成的表格名称列表 List fileNameList = new ArrayList<>(); @@ -452,7 +457,7 @@ public class ExcelServiceImpl implements ExcelService { // 设置单号 excelInfoByWrite.setCode(record.getCode()); // 获取当前出库单申请人 - UserByPort applicanter = LinkInterfaceUtil.FindUserById(record.getApplicantId(), userKey,token); + UserByPort applicanter = LinkInterfaceUtil.FindUserById(record.getApplicantId(), userKey, token); // 设置申请人名称 excelInfoByWrite.setApplicantName(applicanter.getName()); // 获取施工单位Id @@ -473,7 +478,7 @@ public class ExcelServiceImpl implements ExcelService { if ("".equals(s)) { continue; } - UserByPort checker = LinkInterfaceUtil.FindUserById(ObjectFormatUtil.toInteger(s), userKey,token); + UserByPort checker = LinkInterfaceUtil.FindUserById(ObjectFormatUtil.toInteger(s), userKey, token); sb.append(checker.getName()); } // 设置审核人名称 @@ -487,7 +492,7 @@ public class ExcelServiceImpl implements ExcelService { Integer adminorgId = record.getAdminorgId(); if (adminorgId != null) { - Administration company = LinkInterfaceUtil.getCompany(adminorgId, userKey,token); + Administration company = LinkInterfaceUtil.getCompany(adminorgId, userKey, token); // 设置部门名称 excelInfoByWrite.setAdminorgName(company.getName()); } else { @@ -712,7 +717,7 @@ public class ExcelServiceImpl implements ExcelService { } } ExcelFileInfoPool.removeUserExcelInventoryInfo(number); - log.info("【批量添加】批量添加数据:{}", JSON.toJSONString(excelVosForInventory)+";导入人员"+userByPort.getName()+":"+userByPort.getNumber()); + log.info("【批量添加】批量添加数据:{}", JSON.toJSONString(excelVosForInventory) + ";导入人员" + userByPort.getName() + ":" + userByPort.getNumber()); } @@ -752,7 +757,7 @@ public class ExcelServiceImpl implements ExcelService { } ExcelFileInfoPool.removeUserExcelMaterialTypeInfo(number); - log.info("【批量添加】批量添加数据:{}", JSON.toJSONString(excelVosForMaterialType)+";导入人员"+userByPort.getName()+":"+userByPort.getNumber()); + log.info("【批量添加】批量添加数据:{}", JSON.toJSONString(excelVosForMaterialType) + ";导入人员" + userByPort.getName() + ":" + userByPort.getNumber()); } @@ -796,7 +801,7 @@ public class ExcelServiceImpl implements ExcelService { } } ExcelFileInfoPool.removeUserExcelMaterialInfo(number); - log.info("【批量添加】批量添加数据:{}", JSON.toJSONString(excelVosForMaterial)+";导入人员"+userByPort.getName()+":"+userByPort.getNumber()); + log.info("【批量添加】批量添加数据:{}", JSON.toJSONString(excelVosForMaterial) + ";导入人员" + userByPort.getName() + ":" + userByPort.getNumber()); } diff --git a/src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java b/src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java index 1068d671..ac2010b1 100644 --- a/src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java +++ b/src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java @@ -1950,128 +1950,6 @@ public class MaterialServiceImpl implements MaterialService { return children; } - /** - * 构造树形选择框 - * - * @return - */ - public List InitTreeMenus(String mname, String adminorg) { - // 获取所有顶级类别 - List materialTypeNoParent = materialTypeMapper.findMaterialTypeNoParent(); - // 开启对应数量的线程 - int threadSize = materialTypeNoParent.size(); - ExecutorService exs = new ThreadPoolExecutor(threadSize, threadSize, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(threadSize)); - - // 结果集 - List list = new ArrayList<>(); - List> futureList = new ArrayList>(); - // 1.定义CompletionService - CompletionService completionService = new ExecutorCompletionService(exs); - - for (int i = 0; i < materialTypeNoParent.size(); i++) { - MaterialType materialType = materialTypeNoParent.get(i); - Future future = completionService.submit(new Task(materialType, mname, adminorg)); - futureList.add(future); - } - - - // 3.获取结果 - for (int i = 0; i < materialTypeNoParent.size(); i++) { - Object result = null; - try { - result = completionService.take().get(); - } catch (InterruptedException e) { - e.printStackTrace(); - } catch (ExecutionException e) { - e.printStackTrace(); - } - list.add(result); - } - - - return list; - } - - /** - * 构造树形选择框(盘点) - * - * @return - */ - @Override - public List InitTreeMenus(String mname, String depositoryId, String placeId) { - - List materialTypeNoParent = materialTypeMapper.findMaterialTypeNoParent(); - // 开启对应数量的线程 - int threadSize = materialTypeNoParent.size(); - ExecutorService exs = new ThreadPoolExecutor(threadSize, threadSize, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(threadSize)); - - // 结果集 - List list = new ArrayList<>(); - List> futureList = new ArrayList>(); - - // 1.定义CompletionService - CompletionService completionService = new ExecutorCompletionService(exs); - - for (int i = 0; i < materialTypeNoParent.size(); i++) { - MaterialType materialType = materialTypeNoParent.get(i); - Future future = completionService.submit(new TaskForTaking(materialType, mname, depositoryId, placeId)); - futureList.add(future); - } - // 3.获取结果 - for (int i = 0; i < materialTypeNoParent.size(); i++) { - Object result = null; - try { - result = completionService.take().get(); - } catch (InterruptedException e) { - e.printStackTrace(); - } catch (ExecutionException e) { - e.printStackTrace(); - } - list.add(result); - } - - return list; - } - - /** - * 构造树形选择框(普通) - * - * @return - */ - public List InitTreeMenus(String mname) { - List materialTypeNoParent = materialTypeMapper.findMaterialTypeNoParent(); - // 开启对应数量的线程 - int threadSize = materialTypeNoParent.size(); - ExecutorService exs = new ThreadPoolExecutor(threadSize, threadSize, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(threadSize)); - - // 结果集 - List list = new ArrayList<>(); - List> futureList = new ArrayList>(); - - // 1.定义CompletionService - CompletionService completionService = new ExecutorCompletionService(exs); - - for (int i = 0; i < materialTypeNoParent.size(); i++) { - MaterialType materialType = materialTypeNoParent.get(i); - Future future = completionService.submit(new Task(materialType, mname, "")); - futureList.add(future); - } - // 3.获取结果 - for (int i = 0; i < materialTypeNoParent.size(); i++) { - Object result = null; - try { - result = completionService.take().get(); - } catch (InterruptedException e) { - e.printStackTrace(); - } catch (ExecutionException e) { - e.printStackTrace(); - } - list.add(result); - } - - return list; - } - // 构造树形组件数据模板 public Map InitTreeMenus(MaterialType mt, List children) { if (mt != null) { @@ -2383,7 +2261,6 @@ public class MaterialServiceImpl implements MaterialService { // 用于测试构造属性框 public List InitTreeMenus_Test() { List list = new ArrayList<>(); - List wms_materialTree_result = redisPool.getRedisTemplateByDb(15).opsForList().range("wms_materialTree_result", 0, -1); if (wms_materialTree_result != null && wms_materialTree_result.size() != 0) { try { @@ -2505,8 +2382,7 @@ public class MaterialServiceImpl implements MaterialService { // 获取当前父类的子类 List materialTypeByCondition = materialTypeMapper.findMaterialTypeByCondition(param); if (materialTypeByCondition.size() > 0 && (level == staticlevel)) { - for (int i = 0; i < materialTypeByCondition.size(); i++) { - MaterialType mt = materialTypeByCondition.get(i); + for (MaterialType mt : materialTypeByCondition) { List childForMaterialTypeByParent_test = findChildForMaterialTypeByParent_Test(mt.getOldId(), level + 1, staticlevel); Map stringObjectMap = null; if (childForMaterialTypeByParent_test == null) { @@ -2918,34 +2794,6 @@ public class MaterialServiceImpl implements MaterialService { } } - class TaskForTaking implements Callable { - - MaterialType mt; - String mname; - String placeId; - String depositoryId; - - public TaskForTaking(MaterialType mt, String mname, String depositoryId, String placeId) { - this.mt = mt; - this.mname = mname; - this.placeId = placeId; - this.depositoryId = depositoryId; - } - - @Override - public Object call() throws Exception { - List childForMaterialTypeByParent = findChildForMaterialTypeByParent(mt.getOldId(), mname, depositoryId, placeId); - Map stringObjectMap = new HashMap<>(); - if (childForMaterialTypeByParent != null) { - stringObjectMap = InitTreeMenus(mt, childForMaterialTypeByParent); - } else { - List materialByType = AddMaterialByType(mt, mname, depositoryId, placeId); - stringObjectMap = InitTreeMenus(mt, materialByType); - } - return stringObjectMap; - } - } - // 用于执行测试新算法 class TaskTest implements Callable { @@ -2973,63 +2821,6 @@ public class MaterialServiceImpl implements MaterialService { } } - // 用于执行测试新算法(通过物料名称搜索) - - // 用于执行测试新算法 - class TaskTest_New implements Callable { - - // 待处理的物料类型id列表 - List materialTypeIdList; - - public TaskTest_New(List materialTypeByCondition) { - this.materialTypeIdList = materialTypeByCondition; - } - - @Override - public Object call() throws Exception { - - // 定义树结构结果集 - List list = new ArrayList<>(); - // 查询当前物料类型id列表中的物料类型 - List materialByTypeIds = materialMapper.findMaterialByTypeIds(materialTypeIdList); - // 查询当前物料类型所包含的物料 - List materialTypeByOldIds = materialTypeMapper.findMaterialTypeByOldIds(materialTypeIdList); - - // 定义线程集 - int threadSize = materialTypeByOldIds.size(); - ExecutorService exs = new ThreadPoolExecutor(threadSize, threadSize, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(threadSize)); - - // 定义线程结果集 - List> futureList = new ArrayList>(); - - // 1.定义CompletionService - CompletionService completionService = new ExecutorCompletionService(exs); - - for (int i = 0; i < materialTypeByOldIds.size(); i++) { - // 获取当前物料类型 - MaterialType mt = materialTypeByOldIds.get(i); - // 开启对应线程 - Future future = completionService.submit(new MtTaskTest_New(mt, materialByTypeIds)); - // 添加到线程结果列表 - futureList.add(future); - } - // 3.获取结果 - for (int i = 0; i < materialTypeIdList.size(); i++) { - Object result = null; - try { - result = completionService.take().get(); - } catch (InterruptedException e) { - e.printStackTrace(); - } catch (ExecutionException e) { - e.printStackTrace(); - } - list.add(result); - } - return list; - } - - - } // 用于执行测试新算法 class MtTaskTest_New implements Callable { diff --git a/src/test/java/com/dreamchaser/depository_manage/OtherTest.java b/src/test/java/com/dreamchaser/depository_manage/OtherTest.java index 70bcdee3..ffdf5c94 100644 --- a/src/test/java/com/dreamchaser/depository_manage/OtherTest.java +++ b/src/test/java/com/dreamchaser/depository_manage/OtherTest.java @@ -93,10 +93,50 @@ public class OtherTest { return JSONObject.parseObject(JSONObject.toJSONString(map), UserByPort.class); } + @Test public void main() { -// ExecutorService exs = new ThreadPoolExecutor(10, 10, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(10)); + ExecutorService exs = new ThreadPoolExecutor(10, 100, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(10),new ThreadPoolExecutor.DiscardPolicy()); + for (int i = 0; i < 20; i++) { + int finalI = i; + exs.submit(()->{ + Random random = new Random(); + int threadSize = random.nextInt(9999); + try { + Thread.sleep(threadSize); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println("开始执行第"+ finalI +"个任务"); + }); + } + + for (int i = 0; i < 1000; i++) { + + } + + ThreadPoolExecutor threadPool = (ThreadPoolExecutor) exs; + + exs.shutdown(); // 禁止提交新任务 + // 设定最大重试次数 + try { + // 等待 60 s + if (!exs.awaitTermination(60, TimeUnit.SECONDS)) { + // 调用 shutdownNow 取消正在执行的任务 + exs.shutdownNow(); + // 再次等待 60 s,如果还未结束,可以再次尝试,或者直接放弃 + if (!exs.awaitTermination(60, TimeUnit.SECONDS)) + System.err.println("线程池任务未正常执行结束"); + } + } catch (InterruptedException ie) { + // 重新调用 shutdownNow + exs.shutdownNow(); + } + + exs.submit(()->{ + System.out.println("全部结束后提交新任务"); + }); } @Test