创建多个线程池(ExecutorService)可以吗?

use*_*239 5 java android

我在代码中创建了多个 ExecutorService 实例,通常每个 UI 页面都有一个 ExecutorService 实例。每个ExecutorService实例都会执行一些http get请求线程。

private ExecutorService m_threadPool = Executors.newCachedThreadPool();
Run Code Online (Sandbox Code Playgroud)

这样做可以吗?

我遇到的问题是,有时 http get 请求从 HttpURLConnection getResponseCode() 调用中获得响应代码 -1。不知道是否是多个线程池实例导致的。

谢谢。

And*_*кин 4

ExecutorService 本身只是另一个对象,因此没有太大的开销。但是每个线程池默认都会有一些空闲线程,这是造成主要资源浪费的原因。我建议将每个池中预生成线程的默认数量设置为较小(如果不确定是否发送任何请求,则为 1 或 0),以减少创建额外对象的成本。线程将根据需要创建,您将能够保持代码整洁。

另一种解决方案是使用单个线程池,但为每个 UI 窗口维护单独的任务列表。在这种情况下,当窗口关闭时,您必须迭代所有任务并手动取消正在运行的任务(这也可以在单独的线程中完成)。任务可以用 a 表示Future<?>(它有方便的isDone()方法cancel())。