当前位置: 首页 > 面试题库 >

如何隔离您的程序与对“不良” API的调用?

贲宏硕
2023-03-14
问题内容

当我使用Java开发一款(学术)软件时,我被迫使用一个实施得很差的API。这意味着对某些输入数据集的此API调用有时永远不会返回。这一定是软件中的一个错误,因为它提供的算法是确定性的算法,有时它会终止于一组数据,有时会在同一组数据上陷入无限循环…

但是,修复API或重新实现它完全超出了范围。我什至拥有源​​代码,但该API严重依赖于其他未记录且没有源代码的API,这些API到那时已从网络消失(或从未出现过?)。另一方面,这个“不良”
API是唯一解决我遇到的特定问题的API,因此我真的必须坚持下去。

问题是:处理表现得很讨厌的API的最干净方法是什么?遇到此问题时,我决定将对API的调用放在单独的线程中。然后,另一个线程偶尔会检查该线程是否已终止。如果经过了一定的时间,我将使用杀死处理线程Thread#stop(),然后再次开始处理,希望它在下一次返回。现在,我知道(并且在那时就知道了)此方法已被弃用,并且不能使用。但是在这种学术背景下,让软件
潜在地 运行到未定义状态而不是使其崩溃是可以接受的。

只忽略运行到无限循环中的处理线程也是不可接受的,因为它执行了一些占用大量CPU的操作,这将显着降低用户计算机的速度。

我没有尝试的另一种方法是在一个单独的 进程
而不是线程中启动处理,因为子进程可以干净地杀死,而无需将软件置于不一致的状态。还是新SwingWorker班级(尚未提供)可以完成这项工作?它有一个cancel()方法,但是文档说它
“试图取消执行此任务” ,因此它也不是可靠的方法。


问题答案:

我建议使用单独的过程。基本上,在Java中,没有一个线程可以杀死第二个线程的安全方法,除非定期检查第二个线程是否被中断。

理想的解决方案是使用隔离株。隔离实际上是Java应用程序可以创建,管理和通信的私有虚拟机。特别是,父应用程序可以安全地杀死隔离对象及其所有线程。

参考:JSR-000121应用程序隔离API规范-
最终版本

问题是找到支持隔离的JVM。



 类似资料:
  • 问题内容: 我可以附加到docker进程,但是+ 不能与其分离。基本上停止了这个过程。 建议使用什么工作流程来运行流程,偶尔将其附加以进行一些更改,然后分离? 问题答案: 要在不退出外壳的情况下分离tty,请使用转义序列+ 后跟+ 。更多细节在这里。 此来源的其他信息: docker run -t -i→可以与docker attach 分离并重新连接 docker run -i→不能与分离; 会

  • 本文向大家介绍请解释下什么是cookie隔离?为什么要隔离?如何隔离?相关面试题,主要包含被问及请解释下什么是cookie隔离?为什么要隔离?如何隔离?时的应答技巧和注意事项,需要的朋友参考一下 什么是 Cookie 隔离? 或者说:请求资源的时候不要让它带 cookie 怎么做 cookie 隔离技术和传统的多域名拆分请求,提高浏览器并发请求数有点类似,均是采用多域名来处理请求 传统做法是将 c

  • 问题内容: Java代码: Scala代码: 命令行: 问题答案: 我将从使用java.util.Timer开始,而不是从javax.swing.Timer开始。除非您使用GUI运行应用程序,否则swing计时器将不起作用(即,如果您在没有特殊命令行参数的情况下通过控制台在Linux上运行它,则它将不起作用- 最好避免)。 放在一边: 请确保在尝试运行代码时,在类路径中包含scala-librar

  • 我刚刚发布了我的应用程序为穿戴设备,它的手表脸,没有任何UI为电话应用程序。我上传到了Google Play。但它说这个应用程序与你的设备不兼容。到所有用户或设备。 有人知道吗?

  • 问题内容: 我们中的许多人都需要处理用户输入,搜索查询以及输入文本可能包含亵渎或不受欢迎语言的情况。通常,这需要过滤掉。 在哪里可以找到各种语言和方言的咒骂单词的好清单? 是否有API可供包含良好列表的来源使用?还是仅使用某些参数简单地说“是的干净”或“没有这个脏”的API? 有什么好的方法可以捕获试图欺骗系统的人员,例如a $$,azz或a55? 如果您提供PHP解决方案,则可以加分。:) 编辑