【问题标题】:Is it OK to create multiple threadpools (ExecutorService)?可以创建多个线程池(ExecutorService)吗?
【发布时间】:2010-06-04 11:39:00
【问题描述】:

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

private ExecutorService m_threadPool = Executors.newCachedThreadPool();

这样可以吗?

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

谢谢。

【问题讨论】:

    标签: java android


    【解决方案1】:

    ExecutorService per se 只是另一个对象,所以没有大的开销。 但是默认情况下,每个线程池都带有许多空闲线程,这些是主要资源浪费的原因。我建议将每个池中预生成线程的默认数量设置为小(如果您不确定是否发送了任何请求,则为 1 或 0),以降低创建额外对象的成本。线程将按需创建,您将能够保持代码干净。

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

    【讨论】:

      【解决方案2】:

      这不应该是由您的线程池实例引起的。但是,我会说拥有多个线程池是有问题的。你为什么需要它?这可能会导致大量不必要的线程,从而导致不必要的内存使用。

      【讨论】:

      • 我为每个UI页面创建了一个ExecutorService实例,所以当页面关闭时,我可以调用m_threadPool.shutdown()来取消这个UI页面的http请求线程。这是我的目的。这个逻辑还没有加到我的代码中,所以-1响应代码也不应该是threadPool关闭引起的。
      猜你喜欢
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 2014-08-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多