Когда я разработал часть (академического) программного обеспечения с использованием Java, я был вынужден использовать API, который был довольно плохо реализован. Это означает, что вызовы этого API для определенного набора входных данных иногда никогда не возвращаются. Это, должно быть, было ошибкой в программном обеспечении, поскольку предлагаемые алгоритмы были детерминированными, а иногда и заканчивались на наборе данных, иногда он запускался в бесконечный цикл на одном наборе данных...
Тем не менее, исправление API или переопределение его было просто вне сферы действия. У меня даже был источник, но API в значительной степени полагался на другие API, которые были недокументированы и без источника, и к тому времени исчезли из Интернета (или никогда там не были?). С другой стороны, этот "плохой" API был единственным, кто решил конкретную проблему, которую я имел, поэтому мне действительно пришлось придерживаться ее.
Вопрос: какой самый чистый способ иметь дело с API, который ведет себя так, ну, противно? Когда я столкнулся с этой проблемой, я решил поместить вызовы в API в отдельный поток. Затем другой поток иногда проверял, завершился ли этот поток. Если прошло определенное количество времени, я бы убил поток обработки с помощью Thread#stop() и снова начал обработку, надеясь, что он вернется в следующий раз. Теперь я знаю (и знал тогда), что этот метод устарел и не должен использоваться. Но в этом академическом контексте было приемлемо, чтобы программное обеспечение потенциально запускалось в состояние undefined вместо того, чтобы сбой.
Было также неприемлемо просто игнорировать поток обработки, который запущен в бесконечный цикл, потому что он выполнял некоторые довольно интенсивные операции с процессором, которые значительно замедляли работу пользователя.
Другой способ, который я не пытался, - начать обработку в отдельном процессе, а не в потоке, потому что подпроцесс можно убить чисто, не помещая программное обеспечение в непоследовательное состояние. Или новый класс SwingWorker (который еще не был доступен) выполнил эту работу? Он имеет метод cancel(), но документы говорят, что он "пытается отменить выполнение этой задачи", поэтому он не похож на надежный подход.