关闭所有Http连接实例

时间:2011-08-15 19:09:32

标签: java multithreading applet

我使用Java applet开发了一个可以同时上传多个文件的应用程序。

多个线程正在处理文件的同步上传。

当用户点击“取消”按钮时,所有上传内容都将被取消。

我正在使用HttpMethod通过http连接上传。

我应该采用什么方法同时关闭所有http连接实例?

当用户点击“取消”按钮停止所有连接时,我按如下方式关闭了连接管理器:

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

但是当用户再次在“开始”按钮上再次单击时,我正在尝试创建一个新的连接管理器实例,但无法这样做。

我收到错误

java.lang.IllegalStateException: Connection factory has been shutdown

另外,我尝试使用Thread.interrupt(),但它没有相应的工作,即不会中断所有线程。

任何建议/提示都会有所帮助。

3 个答案:

答案 0 :(得分:0)

一种简单的方法是中断所有上传线程。您的上传runnable应该捕获InterruptedException并查询共享取消标记并取消http请求。

在上传工作者runnable中:

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();
 }
}

答案 1 :(得分:0)

关闭并断开连接。在read()中被阻塞的线程将抛出IOException或可能是SocketException,因此您必须编写代码来处理它。

答案 2 :(得分:0)

如果线程A在套接字内被阻塞,你应该能够有另一个线程(我称之为'B')关闭该套接字并解锁'A'。我不记得究竟它是如何在HttpClient中工作的,但它使用了引擎盖下的套接字,所以它仍然适用。

单个线程'B'应该能够顺序解锁所有套接字。这可能是矫枉过正,但是如果担心某些东西可能会卡在close()中,则可以为每个被阻塞的套接字生成一个单独的线程。