import com.sun.jna.NativeLibrary;
public class CallFortranDLL {
public void FotranRunModel(String userworkPath, int pathLen) {
try {
NativeLibrary instance = null;
instance = NativeLibrary.getInstance("XXX.dll");
instance.getFunction("Model2DRun").invokeInt(new Object[]{userworkPath, pathLen});
instance.dispose();
} catch (Exception e) {
e.printStackTrace();
}
}
}
以上是调用dll的类,dll中的函数Model2DRun是执行一项复杂耗时的计算。
在webAPI接口中通过userID参数来选择选择计算所需的输入输出文件路径,设想通过这样可以让不同的用户调用该接口时在预设的用户文件夹中完成计算。
问题是,当用户1正在进行计算,此时用户2又发起来了对该方法的请求,则会导致用户1的计算异常。
如果用户1已经完成了计算,用户2再做计算,则会正常进行。
对于上述存在的问题, public void FotranRunModel改为public static synchronized void FotranRunModel则可以实现顺利计算,但明显不是并发的,而是让用户2在等待用户1的计算完成后才执行2的请求,这样的做法对于用户过多的情况明显是不合适的。
另外,还测试了将dll在各用户的文件夹中均复制一份,然后NativeLibrary.getInstance("XXX.dll");修改为加载各用户文件夹中的dll,也是没用的,也会导致数据混乱,计算异常,甚至将dll复制后改为与用户相关的名字,也就是说调用多个dll,也不行,仍然是数据混乱,没法正常计算。
那么有没有什么合适的方法处理上述问题?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。