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