【问题标题】:ThreadPoolExecutor for running AbortableHttpRequest - how to call abort?用于运行 AbortableHttpRequest 的 ThreadPoolExecutor - 如何调用中止?
【发布时间】:2012-02-13 05:13:43
【问题描述】:

我在 android 中运行网络服务,在该服务中我指示所有 http 请求运行,并在请求完成时从服务中获取回调。我在ThreadPoolExecutor 中运行请求以限制并发请求的数量。当请求在池中运行时,它们最终会创建一个 HttpGet 或 HttpPost,它们都间接实现了AbortableHttpRequest,它允许取消连接(例如,如果它长时间阻塞)。

如果用户取消请求,我想以某种方式深入线程队列并为该请求调用中止例程。例如,如果一个网站没有响应,而用户选择做其他事情,那么现在我唯一的选择是等待该挂起请求发生标准的 5 分钟 http 超时,然后释放该线程。如果我可以访问有我的请求的线程并调用 abort,那将立即释放一切。

据我所知,一旦我的请求进入线程池,它就会出现,直到它从另一端出来。查询队列只会交还futures,会隐藏runnable。

有没有更好的方法呢?我对 java 和线程相当陌生(我主要使用 perl,它根本不能很好地处理线程)。

【问题讨论】:

    标签: java android multithreading http threadpool


    【解决方案1】:

    仅仅因为您将任务交给线程池执行器并不意味着您不能对其进行引用。保留任务的引用,如果用户选择取消它,则对您的任务调用 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 = ...;
            }
            ...
        }
    }
    

    【讨论】:

    • 感谢您向正确的方向推动。这几天一直沉浸在穿线中,只见树木不见森林......
    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 2016-06-04
    • 1970-01-01
    • 2021-10-14
    • 2012-01-21
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    相关资源
    最近更新 更多