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