Лучшая практика для уничтожения потока JavaME 1.2?

Вопрос: Мне интересно узнать о лучшей практике для убийства долговременной операции, которая работает как фоновый поток (позволяет вызывать этот поток 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's внедрение Java ME 1.2 и его Thread API, поэтому нет явного метод kill()
  • Больше всего обеспокоены лучшей практикой и наиболее безопасно убить удерживающий поток.

Follow Up/Edit
Нил Коффи рекомендовал, чтобы я просто ссылался на объект соединения и вместо этого вызывал закрыть() на этом объекте. В настоящее время я изучаю это...

Ответ 1

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

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

Любые открытые потоки приведут к тому, что соединение будет открыто до тех пор, пока они сами закрыты.

Вам нужно закрыть поток, который был получен из Connection.

Ответ 2

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

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

Ответ 3

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

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