线程数控制

项目需求: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);
            }
        }
相关推荐
xrkhy1 分钟前
Java全栈面试题及答案汇总(3)
java·开发语言·面试
SunnyDays10114 分钟前
Java 高效实现 CSV 转 PDF
java·csv转pdf
菩提祖师_5 分钟前
量子机器学习在时间序列预测中的应用
开发语言·javascript·爬虫·flutter
刘97535 分钟前
【第22天】22c#今日小结
开发语言·c#
隐形喷火龙6 分钟前
SpringBoot 异步任务持久化方案:崩溃重启不丢任务的完整实现
java·spring boot·后端
我是koten7 分钟前
K8s启动pod失败,日志报非法的Jar包排查思路(Invalid or corrupt jarfile /app/xxxx,jar)
java·docker·容器·kubernetes·bash·jar·shell
WX-bisheyuange11 分钟前
基于Spring Boot的库存管理系统的设计与实现
java·spring boot·后端
明天好,会的12 分钟前
分形生成实验(三):Rust强类型驱动的后端分步实现与编译时契约
开发语言·人工智能·后端·rust
YanDDDeat15 分钟前
【JVM】类初始化和加载
java·开发语言·jvm·后端
码农水水16 分钟前
阿里Java面试被问:单元测试的最佳实践
java·面试·单元测试