Как изолировать Вашу программу от вызовов до “плохого” API?

(setf (nth N L) NEW)

должен добиться цели.

12
задан Michael Myers 4 August 2009 в 09:09
поделиться

4 ответа

Я бы рекомендовал использовать отдельный процесс. По сути, не существует безопасного способа убить второй поток в Java одним потоком, если только второй поток периодически не проверяет, не был ли он прерван.

Идеальным решением было бы использовать изоляты. Изолятор - это, по сути, частная виртуальная машина, которую приложение Java может создавать, управлять и взаимодействовать с ней. В частности, родительское приложение может безопасно уничтожить изолятор и все его потоки.

Ссылка: JSR-000121 Спецификация API изоляции приложений - окончательный выпуск

Проблема заключается в поиске JVM, поддерживающей изоляты.

11
ответ дан 26 October 2019 в 10:45
поделиться

Ответы @S.Lott и @Stephen C точны в отношении того, как справляться с подобными ситуациями, но я бы хотел добавить, что в неакадемической среде вы также следует попытаться заменить API как можно скорее. В ситуациях, когда мы застревали в плохом API, обычно из-за выбора продаваемого решения по другим причинам, я со временем работал над заменой функциональности моей собственной. Ваши клиенты не будут такими терпимыми, как ваш профессор, поскольку им на самом деле придется использовать ваше программное обеспечение (или нет!), А не просто оценивать его.

Конечно, существуют ситуации, когда использование клейкой ленты является адекватным выбором для решения проблемы . Однако, когда это приводит к такому плохому поведению, как вы описываете, лучше не полагаться на это слишком долго и начать работу над настоящим ремонтом.

2
ответ дан 26 October 2019 в 10:45
поделиться

Я большой поклонник отдельных процессов для такого рода вещей.

Создайте подпроцесс и дождитесь результатов.

Если API не является детерминированным, введите поток таймера в оболочке, которая превращает плохой API в основную программу.

Таким образом, подпроцесс всегда заканчивается в заданное время. Это либо дает полезный результат, либо код выхода системы, указывающий на сбой.

5
ответ дан 26 October 2019 в 10:45
поделиться

Лучшее , что можно сделать, - это повторно реализовать рассматриваемый API. Однако, как вы говорите, это очень тяжелое и, вероятно, выходящее за рамки решение.

Следующим вариантом было бы обернуть API, если это возможно. По сути, если вы можете заранее определить, что именно вызывает сбой в наборах данных, вы можете отклонить вызовы, чтобы гарантировать детерминизм. Не похоже, что это сработает и для вас, поскольку вы предполагаете, что повторный вызов с тем же набором данных иногда завершается, если он бесконечно зацикливался в предыдущем вызове.

Учитывая, что указанные выше параметры недоступны:
Я думаю, что ваше текущее решение для потоков является лучшим из плохих вариантов . Запуск процесса для вызова метода кажется слишком тяжелым, чтобы быть приемлемым с точки зрения производительности, даже если это безопаснее, чем использование потоков. Thread.stop () очень опасен, но если вы неукоснительно предотвращаете любую блокировку, вы можете избежать наказания.

1
ответ дан 26 October 2019 в 10:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: