线程数控制

项目需求:java+MATLAB并行开发 在java中调用由MATLAB转成的jar包的代码,需要调用到底层的MATLAB服务。每次只能一个线程调用,当多个线程同时调用MATLAB时,MATLAB会报错。导致整个java服务挂掉。

现在增加线程控制,每次只允许一个线程调用MATLAB代码。

使用ConcurrentHashMap来确保线程数量,在调用的service中定义一个变量用来保存当前调用的请求

java 复制代码
 private final Map<String, Boolean> ongoingRequests = new ConcurrentHashMap<>();

每次有新的请求进入时,判断是否已经存在相同的请求 存在则返回报错信息"服务器繁忙,请稍后重试"

java 复制代码
 String requestKey = req.toKey();
        System.out.println("-------"+ongoingRequests.size());
        synchronized (ongoingRequests) {
            if (ongoingRequests.size() > LineEnum.LINE_THREE.getLineNumber() || ongoingRequests.containsKey(requestKey)) {
                return new AbnormalResultDTO(ERROR_SERVICE_BUSY.getCode_default(), ERROR_SERVICE_BUSY.getComment());
            }
            // 都是matlab代码调用
            if (req.getOrbitType() == HALO_PLOT.getOrbitCode() || req.getOrbitType() == MOON_EARTH.getOrbitCode() ||  req.getOrbitType() == EARTH_MOON.getOrbitCode()){
                ongoingRequests.put(requestKey, true);
            }
        }
        try {
            OrbitPeriodVo result = algorithmService.getOrbitPeriodData(req);
            return Objects.isNull(result) ?
                    new AbnormalResultDTO(ERROR_RESULT_MESSAGE.getCode_default(), ERROR_RESULT_MESSAGE.getName_default()) :
                    new NormalResultDTO<>(result);
        } finally {
            synchronized (ongoingRequests) {
                ongoingRequests.remove(requestKey);
            }
        }
相关推荐
毕设源码-朱学姐20 小时前
【开题答辩全过程】以 基于SpringBoot+Vue的百货商品进出货平台为例,包含答辩的问题和答案
java·spring boot·后端
左左右右左右摇晃20 小时前
Java笔记——包装类(自动拆装箱)
java·笔记·python
CSDN_Colinw20 小时前
C++中的工厂方法模式
开发语言·c++·算法
森林里的程序猿猿20 小时前
Java深入理解并发、线程、与等待通知机制(一)
java
liulilittle20 小时前
范围随机算法实现
开发语言·c++·算法·lua·c·js
夜空下的星20 小时前
springboot实现Minio大文件分片下载
java·spring boot·后端
乌索普-21 小时前
基于vue2的简易购物车
开发语言·前端·javascript
走粥21 小时前
使用indexOf查找对象结合Pinia持久化引发的问题
开发语言·前端·javascript
Huangxy__21 小时前
接口的的的~
java
廋到被风吹走21 小时前
【MySql】超时问题分析
java·数据库·mysql