Javaを使用して(アカデミック)ソフトウェアを開発したとき、実装がかなり悪いAPIを使用せざるを得ませんでした。これは、特定の入力データのセットに対するこのAPIの呼び出しが、返されない場合があることを意味します。提供されたアルゴリズムは決定論的なものであり、データセットで終了することもあれば、同じデータセットで無限ループに陥ることもあるため、これはソフトウェアのバグであったに違いありません...
ただし、APIの修正または再実装は、単に範囲を超えていました。私もソースを持っていましたが、APIは、文書化されておらず、ソースがなく、Webから消えてしまった(または存在しなかった)他のAPIに大きく依存していました。一方、この「悪い」APIは、私が抱えていた特定の問題を解決した唯一のAPIだったので、私は本当にそれに固執しなければなりませんでした。
問題は、それを動作させるAPIを処理する最もクリーンな方法は何ですか?この問題に直面したとき、APIへの呼び出しを別のスレッドに入れることにしました。次に、別のスレッドが、このスレッドが終了したかどうかをときどきチェックします。一定の時間が経過したら、を使用して処理スレッドをThread#stop()強制終了し、次回に戻ることを期待して処理を再開します。今、私はこのメソッドが非推奨であり、使用してはならないことを知っています(そして当時は知っていました)。しかし、この学術的な文脈では、ソフトウェアがクラッシュするのではなく、未定義の状態になる可能性があることは許容されていました。
また、無限ループに陥った処理スレッドを無視することもできませんでした。これは、CPUを大量に消費する操作を実行して、ユーザーのマシンの速度を大幅に低下させるためです。
私が試しなかったもう1つの方法は、スレッドではなく別のプロセスで処理を開始することです。これは、ソフトウェアを不整合な状態にすることなく、サブプロセスを完全に強制終了できるためです。または、新しいSwingWorkerクラス(まだ利用できませんでした)がその仕事をしたでしょうか?方法はcancel()ありますが、ドキュメントには「このタスクの実行をキャンセルしようとしている」と書かれているため、信頼できるアプローチのようにも見えません。