Rob*_*ier 12 java multithreading multiprocessing
当我使用Java开发一个(学术)软件时,我被迫使用一个执行得相当糟糕的API.这意味着对某一组输入数据的此API调用有时永远不会返回.这一定是软件中的一个错误,因为它提供的算法是确定性的,有时会终止于一组数据,有时它会在同一组数据上遇到无限循环......
但是,修复API或重新实现它只是超出范围.我甚至拥有源代码,但API很大程度上依赖于其他未记录且没有源代码的API,并且当时从网络上消失(或者从未在那里?).另一方面,这个"坏"API是解决我遇到的具体问题的唯一一个,所以我真的不得不坚持下去.
问题是:处理API的最干净的方法是什么呢?好吧,讨厌?当我遇到这个问题时,我决定将对API的调用放入一个单独的线程中.然后,另一个线程偶尔会检查此线程是否已终止.如果已经过了一定的时间,我会使用处理线程Thread#stop()并再次开始处理,希望它会在下次返回.现在,我知道(并且当时知道)该方法已被弃用,不得使用.但是在这种学术背景下,软件可能会进入未定义状态而不是崩溃是可以接受的.
忽略已经遇到无限循环的处理线程也是不可接受的,因为它做了一些非常耗费CPU的操作,这会大大减慢用户的机器速度.
我没有尝试的另一种方法是在单独的进程而不是线程中开始处理,因为可以干净地杀死子进程而不会使软件处于不一致状态.或者新SwingWorker课程(尚未提供)可以完成这项工作吗?它有一个cancel()方法,但文档说它"尝试取消执行此任务",所以它看起来也不像是一个可靠的方法.
Ste*_*n C 11
我建议使用一个单独的过程.除非第二个线程定期检查它是否已被中断,否则一个线程基本上没有安全的方法来杀死Java中的第二个线程.
理想的解决方案是使用分离株.隔离本质上是Java应用程序可以创建,管理和通信的私有虚拟机.特别是,父应用程序可以安全地杀死隔离及其所有线程.
参考:JSR-000121应用程序隔离API规范 - 最终版本
问题是找到支持Isolates的JVM.
我非常喜欢这种事情的独立流程.
生成子流程并等待结果.
如果API是非确定性的,则将计时器线程放在一个包装器中,使得错误的API成为主程序.
这样,子进程总是在给定时间内结束.它要么产生有用的结果,要么产生指示失败的系统退出代码.
| 归档时间: |
|
| 查看次数: |
1770 次 |
| 最近记录: |