Лучший способ убить поток JavaME 1.2? - PullRequest
2 голосов
/ 08 мая 2009

Вопрос: Мне интересно узнать, как лучше всего убить давнюю операцию, которая выполняется как фоновый поток (давайте назовем этот поток WorkerThread) в Java 1.2.

Сценарий

В частности, я разрабатываю приложение для устройств Blackberry, с помощью которого я устанавливаю HTTP-соединение. Большая картина: запрос URL, если он перенаправлен в фоновый поток (WorkerThread), поток выполняет запрос и возвращает результат с помощью обратного вызова.

Подробности сценария

Теперь существует ситуация, когда во время соединения существует соединение для передачи данных , но затем по любой причине (проезжает через туннель), что соединение больше не существует. Из-за ограничений в архитектуре проектирования Blackberry это фактическое соединение будет зависать, так как время ожидания установлено равным 2 минутам. В результате крайне необходимо уничтожить соединение, которое зависало в течение относительно (15 секунд) длительного периода времени.

Мое текущее решение - 2 Theads?

Сейчас мое текущее решение - запустить WorkerThread внутри другого потока (давайте назовем этот новый поток MonitorThead). MonitorThread начинает WorkerThread, спит в течение 1000 мс, а затем регулярно проверяет, жив ли WorkerThread. Если через 15 секунд WorkerThread все еще активен, MonitorThread переводит WorkerThread в спящий режим и завершает работу. Это действительно лучший подход?

Краткое изложение вопросов и ключевых моментов

Таким образом, ниже приведен основной вопрос и основные ограничения, связанные с этим вопросом. Ура!

Как мне успешно завершить фоновый поток Java, застрявший в определенной операции?

Сценарий Ограничения:

  • Нет контроля над приостановкой работы и проверьте состояние запрошенных потоков
  • Специфично для Blackberry реализация Java ME 1.2 и его Thread API , так что нет явного kill () метод
  • Больше всего волнует передовая практика и как наиболее безопасно убить удерживающую нить.

Отслеживание / редактирование
Нил Коффи рекомендовал, чтобы я просто держал ссылку на объект соединения и вместо этого вызывал close () для этого объекта. Я сейчас изучаю это ...

Ответы [ 3 ]

2 голосов
/ 08 мая 2009

Как убить тему - сложный вопрос. Не существует гарантированного способа остановить или прервать поток. Однако, если вы берете текущую архитектуру и по истечении времени ожидания просто закройте поток (не Connection ), это должно вызвать исключение ввода-вывода в потоке, который застрял в ввод-выводе. Если это не вызывает IOException, то это должно по крайней мере заставить чтение или запись возвращаться с EOF.

Обратите внимание, что закрытие соединения не помогает, как говорит JavaDoc:

Любые открытые потоки будут держать соединение открытым до они сами закрыты.

Вы должны закрыть поток, полученный из соединения.

1 голос
/ 08 мая 2009

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

Как вы делаете соединение? Вместо того, чтобы ждать, пока оно истечет, каковы ваши шансы заставить его закрыться? Можете ли вы получить какой-то объект подключения? Есть ли у Blackberry какие-то другие команды, которые можно выполнить, чтобы разорвать данное соединение?

0 голосов
/ 08 мая 2009

Я всегда считал, что передача флага в фоновый поток в атомарной транзакции - лучший способ попросить поток остановиться. Если он не остановится какое-то время, убейте его.

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

...