我在android中运行网络服务,我指示所有的http请求运行,并在请求完成时从服务获取回调。我在ThreadPoolExecutor中运行请求以限制并发请求的数量。当请求在池中运行时,它们最终会创建一个HttpGet或HttpPost,它们都间接实现AbortableHttpRequest,这允许人们取消连接(例如,如果它长时间阻塞)。
如果用户取消请求,我想以某种方式钻入线程队列并为该请求调用中止例程。例如,如果一个网站没有响应并且用户选择做其他事情,那么我现在唯一的选择是在该线程被释放之前等待该挂起请求的标准5分钟http超时。如果我可以访问有我请求的线程并调用abort,那么就可以立即解决问题。
根据我的理解,一旦我的请求进入线程池,它就会出现,它是一个黑盒子,直到它出现在另一端。查询队列只会回收期货,这会隐藏可运行的货物。
有更好的方法吗?我是java和线程的新手(我主要做的是perl,它根本不能很好地完成线程)。
答案 0 :(得分:2)
仅仅因为您向线程池执行者提供任务并不意味着您无法对其进行引用。保留对任务的引用,如果用户选择取消它,则在您的任务上调用abort。
public class MyAbortableRunnable implements Runnable {
private final Object lock = new Object();
private AbortableHttpRequest request;
public void abort() {
synchronized(lock) {
if (request != null) {
request.abort();
}
}
}
@Override
public void run() {
...
// create the request
synchronized(lock) {
this.request = ...;
}
...
}
}