Browse Source

优化系统线程结构

lwx_dev
erdanergou 3 years ago
parent
commit
c2e9dc2a88
  1. 18
      src/main/java/com/dreamchaser/depository_manage/security/pool/HandlesOtherFunctionalThreadPool.java
  2. 8
      src/main/java/com/dreamchaser/depository_manage/security/pool/SendQyWxMessageThreadPool.java
  3. 18
      src/main/java/com/dreamchaser/depository_manage/service/MaterialService.java
  4. 9
      src/main/java/com/dreamchaser/depository_manage/service/impl/ExcelServiceImpl.java
  5. 211
      src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java
  6. 42
      src/test/java/com/dreamchaser/depository_manage/OtherTest.java

18
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(); // 禁止提交新任务
// 设定最大重试次数

8
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){

18
src/main/java/com/dreamchaser/depository_manage/service/MaterialService.java

@ -232,24 +232,6 @@ public interface MaterialService {
*/
Integer updateStateByTypeId(Map<String,Object> map);
/**
* 构造树形选择框(部门)
* @return
*/
List<Object> InitTreeMenus(String mname,String adminorg);
/**
* 构造树形选择框(盘点)
* @return
*/
List<Object> InitTreeMenus(String mname,String depositoryId,String placeId);
/**
* 构造树形选择框
* @return
*/
List<Object> InitTreeMenus(String mname);
/**
* 构造树形选择框(测试)
* @return

9
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<Future<List<String>>> futureList = new ArrayList<Future<List<String>>>();
@ -413,7 +419,6 @@ public class ExcelServiceImpl implements ExcelService {
* 用于出库订单填充
*
* @param id 待打印出库订单id
* @param pageSize 一张最多打印条数
*/
@Override

211
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<Object> InitTreeMenus(String mname, String adminorg) {
// 获取所有顶级类别
List<MaterialType> materialTypeNoParent = materialTypeMapper.findMaterialTypeNoParent();
// 开启对应数量的线程
int threadSize = materialTypeNoParent.size();
ExecutorService exs = new ThreadPoolExecutor(threadSize, threadSize, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(threadSize));
// 结果集
List<Object> list = new ArrayList<>();
List<Future<Object>> futureList = new ArrayList<Future<Object>>();
// 1.定义CompletionService
CompletionService<Object> completionService = new ExecutorCompletionService<Object>(exs);
for (int i = 0; i < materialTypeNoParent.size(); i++) {
MaterialType materialType = materialTypeNoParent.get(i);
Future<Object> 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<Object> InitTreeMenus(String mname, String depositoryId, String placeId) {
List<MaterialType> materialTypeNoParent = materialTypeMapper.findMaterialTypeNoParent();
// 开启对应数量的线程
int threadSize = materialTypeNoParent.size();
ExecutorService exs = new ThreadPoolExecutor(threadSize, threadSize, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(threadSize));
// 结果集
List<Object> list = new ArrayList<>();
List<Future<Object>> futureList = new ArrayList<Future<Object>>();
// 1.定义CompletionService
CompletionService<Object> completionService = new ExecutorCompletionService<Object>(exs);
for (int i = 0; i < materialTypeNoParent.size(); i++) {
MaterialType materialType = materialTypeNoParent.get(i);
Future<Object> 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<Object> InitTreeMenus(String mname) {
List<MaterialType> materialTypeNoParent = materialTypeMapper.findMaterialTypeNoParent();
// 开启对应数量的线程
int threadSize = materialTypeNoParent.size();
ExecutorService exs = new ThreadPoolExecutor(threadSize, threadSize, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(threadSize));
// 结果集
List<Object> list = new ArrayList<>();
List<Future<Object>> futureList = new ArrayList<Future<Object>>();
// 1.定义CompletionService
CompletionService<Object> completionService = new ExecutorCompletionService<Object>(exs);
for (int i = 0; i < materialTypeNoParent.size(); i++) {
MaterialType materialType = materialTypeNoParent.get(i);
Future<Object> 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<String, Object> InitTreeMenus(MaterialType mt, List<Object> children) {
if (mt != null) {
@ -2383,7 +2261,6 @@ public class MaterialServiceImpl implements MaterialService {
// 用于测试构造属性框
public List<Object> InitTreeMenus_Test() {
List<Object> list = new ArrayList<>();
List<String> 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<MaterialType> 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<Object> childForMaterialTypeByParent_test = findChildForMaterialTypeByParent_Test(mt.getOldId(), level + 1, staticlevel);
Map<String, Object> stringObjectMap = null;
if (childForMaterialTypeByParent_test == null) {
@ -2918,34 +2794,6 @@ public class MaterialServiceImpl implements MaterialService {
}
}
class TaskForTaking implements Callable<Object> {
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<Object> childForMaterialTypeByParent = findChildForMaterialTypeByParent(mt.getOldId(), mname, depositoryId, placeId);
Map<String, Object> stringObjectMap = new HashMap<>();
if (childForMaterialTypeByParent != null) {
stringObjectMap = InitTreeMenus(mt, childForMaterialTypeByParent);
} else {
List<Object> materialByType = AddMaterialByType(mt, mname, depositoryId, placeId);
stringObjectMap = InitTreeMenus(mt, materialByType);
}
return stringObjectMap;
}
}
// 用于执行测试新算法
class TaskTest implements Callable<Object> {
@ -2973,63 +2821,6 @@ public class MaterialServiceImpl implements MaterialService {
}
}
// 用于执行测试新算法(通过物料名称搜索)
// 用于执行测试新算法
class TaskTest_New implements Callable<Object> {
// 待处理的物料类型id列表
List<Long> materialTypeIdList;
public TaskTest_New(List<Long> materialTypeByCondition) {
this.materialTypeIdList = materialTypeByCondition;
}
@Override
public Object call() throws Exception {
// 定义树结构结果集
List<Object> list = new ArrayList<>();
// 查询当前物料类型id列表中的物料类型
List<Material> materialByTypeIds = materialMapper.findMaterialByTypeIds(materialTypeIdList);
// 查询当前物料类型所包含的物料
List<MaterialType> materialTypeByOldIds = materialTypeMapper.findMaterialTypeByOldIds(materialTypeIdList);
// 定义线程集
int threadSize = materialTypeByOldIds.size();
ExecutorService exs = new ThreadPoolExecutor(threadSize, threadSize, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(threadSize));
// 定义线程结果集
List<Future<Object>> futureList = new ArrayList<Future<Object>>();
// 1.定义CompletionService
CompletionService<Object> completionService = new ExecutorCompletionService<Object>(exs);
for (int i = 0; i < materialTypeByOldIds.size(); i++) {
// 获取当前物料类型
MaterialType mt = materialTypeByOldIds.get(i);
// 开启对应线程
Future<Object> 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<Object> {

42
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

Loading…
Cancel
Save