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