我在代码中创建了多个 ExecutorService 实例,通常每个 UI 页面都有一个 ExecutorService 实例。每个 ExecutorService 实例都会执行一些 http get 请求线程。
private ExecutorService m_threadPool = Executors.newCachedThreadPool();
这样做可以吗?
我遇到的问题是,有时 http get 请求从 HttpURLConnection getResponseCode() 调用中得到响应代码 -1。不知道是不是线程池实例多导致的。
谢谢。
最佳答案
ExecutorService
本身 只是另一个对象,因此没有大的开销。 但是默认情况下,每个线程池都有一些空闲线程,这是造成资源浪费的主要原因。我建议将每个池中预生成线程的默认数量设置得较小(如果您不确定是否发送任何请求,则为 1 或 0)以减少创建额外对象的成本。线程将按需创建,您将能够保持代码整洁。
另一种解决方案是使用单个线程池,但为每个 UI 窗口维护一个单独的任务列表。在这种情况下,当窗口关闭时,您将不得不遍历所有任务并手动取消正在运行的任务(这也可以在单独的线程中完成)。任务可以用 Future<?>
表示(它有方便的 isDone()
和 cancel()
方法)。
关于java - 创建多个线程池(ExecutorService)可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2970821/