我在代码中创建了多个ExecutorService实例,通常每个UI页面都有一个ExecutorService实例。每个ExecutorService实例都将执行一些http get请求线程。
private ExecutorService m_threadPool = Executors.newCachedThreadPool();
这样做可以吗?
我遇到的问题是有时http get请求从HttpURLConnection getResponseCode()调用获得响应代码-1。我不知道它是否是由多个线程池实例引起的。
感谢。
答案 0 :(得分:3)
ExecutorService
本身只是另一个对象,所以没有大的开销。 但是默认情况下,每个线程池都带有许多空闲线程,这些都是造成重大资源浪费的原因。我建议将每个池中预先生成的线程的默认数量设置得很小(如果您不确定是否发送任何请求,则为1或0),以降低创建额外对象的成本。线程将根据需要创建,您将能够保持代码清洁。
另一个解决方案是使用单个线程池,但为每个UI窗口维护一个单独的任务列表。在这种情况下,当窗口关闭时,您将不得不迭代所有任务并手动取消正在运行的任务(这也可以在单独的线程中完成)。任务可以用Future<?>
表示(它有方便的isDone()
和cancel()
方法)。
答案 1 :(得分:1)
它不应该由您的线程池实例引起。但是,我会说拥有多个线程池是值得怀疑的。你为什么需要它?它可能会导致许多不必要的线程,从而导致不必要的内存使用。