Закройте все экземпляры соединения Http - PullRequest
0 голосов
/ 15 августа 2011

Я использовал Java-апплет для разработки приложения, в котором есть возможность загрузки нескольких файлов одновременно.

Несколько потоков обрабатывают одновременную загрузку файлов.

Когда пользователь нажимает накнопка Отмена, все загрузки должны быть отменены.

Я использую HttpMethod для загрузки через http-соединение.

Какой подход я должен использовать, чтобы закрыть все экземпляры http-соединения одновременно?

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

manager = new MultiThreadedHttpConnectionManager();
manager.shutdownAll() 

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

Я получаю сообщение об ошибке

java.lang.IllegalStateException: Connection factory has been shutdown

Также я пытался использовать Thread.interrupt (), но егоне работает соответственно, т.е. не прерывает все потоки.

Любые предложения / советы будут полезны.

Ответы [ 3 ]

0 голосов
/ 16 августа 2011

Просто закройте и отсоедините их. Потоки, заблокированные в read (), сгенерируют IOException или, возможно, SocketException, поэтому вы должны написать код, чтобы справиться с этим.

0 голосов
/ 18 августа 2011

Если поток A заблокирован внутри сокета, у вас должна быть возможность иметь другой поток (я назову его «B»), закрыть этот сокет и разблокировать «A».Я не помню точно, как это работает в HttpClient, но он использует сокеты под колпаком, поэтому он все еще должен применяться.

Один поток 'B' должен иметь возможность разблокировать все сокеты последовательно.Это может быть излишним, но если есть опасения, что что-то может застрять в close (), вы можете создать отдельный поток для каждого заблокированного сокета.

0 голосов
/ 16 августа 2011

Простой подход - прервать все потоки загрузки. Ваш загружаемый файл должен перехватить InterruptedException, запросить общий флаг отмены и отменить http-запрос.

В работоспособном загрузчике:

try{
//do http work here
}catch (InterruptedException e){
  if(task.isCancelled()){
    //cancel http upload
  }
}

В управляющей теме

public void onCancel(){
 setCancelled(true);
 for(UploadWorker uploadWorker: uploadWorkers){
  uploadWorker.interrupt();
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...