我使用Java applet开发了一个可以同时上传多个文件的应用程序。
多个线程正在处理文件的同步上传。
当用户点击“取消”按钮时,所有上传内容都将被取消。
我正在使用HttpMethod通过http连接上传。
我应该采用什么方法同时关闭所有http连接实例?
当用户点击“取消”按钮停止所有连接时,我按如下方式关闭了连接管理器:
manager = new MultiThreadedHttpConnectionManager();
manager.shutdownAll()
但是当用户再次在“开始”按钮上再次单击时,我正在尝试创建一个新的连接管理器实例,但无法这样做。
我收到错误
java.lang.IllegalStateException: Connection factory has been shutdown
另外,我尝试使用Thread.interrupt(),但它没有相应的工作,即不会中断所有线程。
任何建议/提示都会有所帮助。
答案 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()中,则可以为每个被阻塞的套接字生成一个单独的线程。