2011-08-15 57 views
0

我已经使用Java applet开发了一个可以同时上传多个文件的应用程序。关闭Http连接的所有实例

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

当用户点击取消按钮时,所有的上传应该被取消。

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

我应该遵循什么方法来同时关闭所有http连接的实例?

我关闭了连接管理器,当用户点击取消按钮来停止所有的连接如下:

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

但是,当用户再次再次点击开始按钮,我想创建连接管理器的新实例,但无法这样做。

我收到错误

java.lang.IllegalStateException: Connection factory has been shutdown 

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

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

+0

您正在使用哪个客户端? “HttpMethod”是指像GET,POST等东西,但它不是客户端。防爆。 HttpUrlConnection,HttpClient。 – seand

+0

上午使用HttpClient – chiranjib

回答

0

一个简单的方法是中断所有的上传线程。您的可运行上传应该赶上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(); 
} 
} 
+1

这可能会或可能不会中断读取一个套接字,它是未指定和平台相关。 – EJP

+0

@EJP I concur;除非最近事情发生了变化,否则在套接字内部阻塞的线程上执行中断()不会释放它。 – seand

0

只需关闭并切断他们。在read()中被阻塞的线程将抛出一个IOException或可能的SocketException,所以你必须编码来应付这个问题。

0

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

单线程'B'应该能够顺序解除所有套接字的阻塞。这可能是矫枉过正的,但是如果有人担心close()会卡住,你可以为每个阻塞的套接字产生一个单独的线程。