当我使用 Java 开发一个(学术)软件时,我被迫使用一个实现得很糟糕的 API。这意味着针对特定输入数据集对该 API 的调用有时永远不会返回。这一定是软件中的一个错误,因为它提供的算法是确定性的,有时它会在一组数据上终止,有时它会在同一组数据上陷入无限循环......
但是,修复 API 或重新实现它完全超出了范围。我什至有源代码,但 API 严重依赖于其他未记录且没有源代码的 API,并且到那时已经从网络上消失了(或者从未存在过?)。另一方面,这个“糟糕”的 API 是唯一一个解决了我遇到的特定问题的 API,所以我真的必须坚持下去。
问题是:处理表现得那么糟糕的 API 的最干净的方法是什么?当我遇到这个问题时,我决定将对 API 的调用放到一个单独的线程中。然后另一个线程偶尔会检查该线程是否已终止。如果过了一定时间,我会杀死正在使用的处理线程Thread#stop()
并重新开始处理,希望它下次会返回。现在,我知道(并且当时知道)这种方法已被弃用,不能使用。但在这个学术背景下,让软件可能运行到未定义状态而不是让它崩溃是可以接受的。
忽略已经进入无限循环的处理线程也是不可接受的,因为它执行了一些相当 CPU 密集型的操作,这会显着降低用户机器的速度。
我没有尝试的另一种方法是在单独的进程而不是线程中开始处理,因为可以干净地杀死子进程而不会使软件处于不一致状态。或者新SwingWorker
课程(尚不可用)可以完成这项工作吗?它有一个cancel()
方法,但文档说它“尝试取消执行此任务”,所以它看起来也不是一种可靠的方法。