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

时间:2010-06-04 00:50:30

标签: java android

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

private ExecutorService m_threadPool = Executors.newCachedThreadPool();

这样做可以吗?

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

感谢。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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